2012-04-21 10 views
6

Nie jestem pewien, który algorytm crypt() używa podczas mieszania. Spojrzałem na podręcznik PHP, ale po prostu mówi, że używa tego, co jest dostępne. Ale skąd mam wiedzieć, którego używa i jak go używać, jak określić, którego użyć? Używam MAMP obecnie jako mojego środowiska programistycznego, ale sądzę, że musi istnieć sposób, aby dowiedzieć się z oświadczeniem w PHP.Jak dowiedzieć się, który algorytm crypt() używa na twoim komputerze?

+0

jakiego formatu soli używasz? – CodesInChaos

+0

Dostarczenie soli, jeśli o to pytasz. – Andy

+1

Jeśli dobrze pamiętam, format soli określa algorytm sprawdzania dokumentacji: http://php.net/manual/en/function.crypt.php – CodesInChaos

Odpowiedz

9

Algorytm określa się jako część ciągu soli. Na przykład zaczynając od numeru $2a$, otrzymasz kod Blowfish. Jeśli urządzenie nie obsługuje algorytmu, którego próbujesz użyć, nie uzyskasz znaczącego wyniku. Możesz spróbować dowiedzieć się z wyprzedzeniem, które algorytmy są obsługiwane przez sprawdzenie niektórych wstępnie zdefiniowanych stałych, takich jak CRYPT_BLOWFISH, chociaż zauważyłem, że stałe CRYPT_SHA256 i CRYPT_SHA512 nie zawsze są zdefiniowane, przynajmniej w PHP 5.2. Począwszy od PHP 5.3, PHP ma swoje własne implementacje algorytmów, więc nie ma znaczenia, co system ma do dyspozycji w czasie kompilacji PHP, tak jak w PHP 5.2 i wcześniejszych. Poprawka Suhosin dla PHP 5.2 podobno dodaje co najmniej Blowfish, ale jego implementacja nie wydaje się być zgodna z tą używaną w PHP 5.3.

PHP docs for the crypt() function dostarczają informacje na temat korzystania ciąg soli, aby określić, który algorytm użyć:

  • CRYPT_STD_DES - hash standard DES oparte z solą dwóch znaków z alfabetu”./0-9A-Za-z ". Użycie nieprawidłowych znaków w soli powoduje, że crypt() nie powiedzie się.
  • CRYPT_EXT_DES - Rozszerzony DES oparty mieszanie . "Sól" to 9-znakowy ciąg złożony z podkreślenia , po którym następuje 4 bajty liczby iteracji i 4 bajty soli. Są to zakodowane jako znaki drukowalne, 6 bitów na znak, co najmniej znaczący znak jako pierwszy. Wartości od 0 do 63 są kodowane jako "./0-9A-Za-z". Użycie nieprawidłowych znaków w soli spowoduje niepowodzenie krypto() .
  • CRYPT_MD5 - MD5 mieszania z solą dwanaście znaków począwszy od $ 1 $
  • CRYPT_BLOWFISH - Blowfish mieszaja z solą jako następująco: "$ 2a $", parametr kosztów dwucyfrowy, "$", a 22 cyfr od alfabet "./0-9A-Za-z". Użycie znaków spoza tego zakresu w spowoduje, że funkcja crypt() zwróci łańcuch o zerowej długości. Obydwa parametry kosztu cyfrowego to logarytm bazowy 2 licznika powtórzeń dla algorytmu bazującego na algorytmie mieszania opartym na Blowfish i musi on być w zakresie z zakresu 04-31, wartości spoza tego zakresu spowodują niepowodzenie krypto().
  • CRYPT_SHA256 - SHA-256 hash z szesnastoma znakami soli z prefiksem z 5 $. Jeśli ciąg soli zaczyna się od "rounds = $", numeryczna wartość N jest używana do wskazania, ile razy pętla mieszająca powinna mieć wartość , podobnie jak parametr kosztu na Blowfish. Domyślna liczba rund to 5000, minimalna wartość to 1000, a maksymalna to 999,999,999. Dowolny wybór N poza tym zakresem zostanie obcięty o do najbliższego limitu.
  • CRYPT_SHA512 - SHA-512 hash z szesnastoma solami o znaku z prefiksem $ 6 $. Jeśli ciąg soli zaczyna się od "rounds = $", wartość liczbowa N jest używana do wskazania, ile powinno być wykonanych pętli haszowania, podobnie jak parametr kosztu na Blowfish.Domyślna liczba rund to 5000, jest co najmniej 1000, a maksymalnie 999,999,999. Dowolny wybór N poza tym zakresem zostanie obcięty do najbliższego limitu.

Tak więc, aby określić, że ma ciąg „hasło” zakodowane przy użyciu Blowfish z 2^10 iteracji, można użyć

crypt('password', '$2a$10$XA86t7EJ0xD9OYEUbnTulT'); 

gdzie łańcuch rozpoczynający się XA86 jest sól.

Wreszcie, jeśli chcesz uzyskać więcej przykładów lub po prostu chcesz zająć się czymś w tym biznesie związanym z kompatybilnością haseł, spójrz na numer phpass. Jest to domena publiczna i działa dobrze w moim doświadczeniu. Automatycznie użyje "najlepszego" algorytmu w systemie, chyba że określisz, że chcesz mieć skrót, który jest kompatybilny z wieloma systemami, w którym to przypadku (jak sądzę) używa MD5.

+0

Tak, to też był mój problem. Naprawdę nie ma wystarczających informacji na ten temat z jakiegoś dziwnego powodu. – Andy

+0

Czy możesz pokazać mi przykład tego, jak będzie wyglądał przy użyciu $ 2a $ na przykład, aby krypta wiedziała, który algorytm użyć? – Andy

+0

Tak, będę edytować za chwilę. Nie mogłem ci podać więcej informacji, ponieważ pisałem na telefonie, gdy chodzę do kasy, aby sprawdzić w sklepie. – Andrew

Powiązane problemy