2012-04-21 14 views
6

Non sono sicuro di quale algoritmo crypt() usi durante l'hashing. Ho guardato il manuale PHP, ma dice solo che usa tutto ciò che è disponibile. Ma come faccio a sapere quale usa e se ne usa uno, come dirgli quale usare? Attualmente sto usando MAMP come ambiente di sviluppo, ma immagino ci debba essere un modo per scoprirlo con una dichiarazione in PHP.Come scoprire quale algoritmo crypt() utilizza sul tuo computer?

+0

quale formato di sale stai usando? – CodesInChaos

+0

Fornire il sale se questo è quello che stai chiedendo. – Andy

+1

Se ricordo bene, il formato del sale determina l'algoritmo controllare i documenti: http://php.net/manual/en/function.crypt.php – CodesInChaos

risposta

9

Si specifica l'algoritmo come parte della stringa salt. Ad esempio, a partire da $2a$ si ottiene una cifratura Blowfish. Se la macchina non supporta l'algoritmo che stai tentando di utilizzare, non otterrai risultati significativi. Puoi provare in anticipo quali algoritmi sono supportati controllando alcune delle costanti predefinite, come CRYPT_BLOWFISH, anche se ho notato che le costanti CRYPT_SHA256 e CRYPT_SHA512 non sono sempre definite, almeno su PHP 5.2. A partire da PHP 5.3, PHP ha le sue implementazioni degli algoritmi, quindi non importa ciò che il sistema ha a disposizione in PHP come in PHP 5.2 e versioni precedenti. La patch Suhosin per PHP 5.2 presumibilmente aggiunge almeno Blowfish, ma la sua implementazione non sembra essere compatibile con quella utilizzata in PHP 5.3.

Il PHP docs for the crypt() function forniscono alcune informazioni su come utilizzare la stringa di sale per specificare quale algoritmo da utilizzare:

  • CRYPT_STD_DES - hash standard DES-based con un sale di due caratteri dell'alfabeto"./0-9A-Za-z". L'uso di caratteri non validi nel file di sale causerà il fallimento di crypt().
  • CRYPT_EXT_DES - Esteso basato su DES. Il "sale" è una stringa di 9 caratteri composta da un trattino basso seguito da 4 byte di conteggio iterativo e 4 byte di sale. Questi sono codificati come caratteri stampabili, 6 bit per carattere, almeno carattere significativo prima. I valori da 0 a 63 sono codificati come "./0-9A-Za-z". L'utilizzo di caratteri non validi nel salt causerà l'errore criptazione() .
  • CRYPT_MD5 - MD5 hash con un sale di dodici personaggio partire con $ 1 $
  • CRYPT_BLOWFISH - hashing Blowfish con un sale come segue: "$ 2a $", un parametro di costo a due cifre, "$", e 22 cifre da l'alfabeto "./0-9A-Za-z". Usando caratteri al di fuori di questo intervallo in , salt genererà crypt() per restituire una stringa di lunghezza zero. Il parametro di costo delle due cifre è il logaritmo in base 2 del conteggio di iterazione per l'algoritmo di hashing basato su Blowfish sottostante e deve essere nell'intervallo 04-31 , i valori all'esterno di questo intervallo causeranno il fallimento di crypt().
  • CRYPT_SHA256 - hash SHA-256 con sedici caratteri salt con prefisso con $ 5 $. Se la stringa salt inizia con "rounds = $", il valore numerico di N viene utilizzato per indicare quante volte il ciclo di hashing deve essere eseguito , in modo simile al parametro di costo su Blowfish. Il numero di round predefinito è 5000, c'è un minimo di 1000 e un massimo di 999,999,999. Qualsiasi selezione di N al di fuori di questo intervallo sarà troncata al limite più vicino.
  • CRYPT_SHA512 - hash SHA-512 con un sedicesimo carattere con prefisso $ 6 $. Se la stringa salata inizia con 'rounds = $', il valore numerico di N viene utilizzato per indicare quante volte deve essere eseguito il ciclo di hashing , analogamente al parametro costo su Blowfish.Il numero predefinito di round è 5000, c'è un minimo di 1000 e un massimo di 999.999.999. Qualsiasi selezione di N al di fuori di questo intervallo verrà troncata al limite più vicino.

Così, per specificare che si desidera che la stringa "password" hash utilizzando Blowfish con 2^10 iterazioni, è possibile utilizzare

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

dove la stringa che inizia con XA86 è il sale.

Infine, se vuoi altri esempi o vuoi solo qualcosa di cui occuparti di tutto questo business di compatibilità delle password per te, dai uno sguardo allo phpass. È di pubblico dominio e funziona bene nella mia esperienza. Utilizzerà automaticamente l'algoritmo "migliore" sul sistema, a meno che non si specifichi che si desidera un hash compatibile con più sistemi, nel qual caso (penso) utilizzi MD5.

+0

Sì, quello era anche il mio problema. Non ci sono abbastanza informazioni su questo per qualche strana ragione. – Andy

+0

Potresti mostrarmi un esempio di come apparirebbe usando $ 2a $ ad esempio per far sapere alla cripta quale algoritmo usare? – Andy

+0

Sì, modificherò in un attimo. Non potevo darti altre informazioni prima, perché stavo scrivendo sul mio telefono mentre ero in fila per andare al negozio. – Andrew

Problemi correlati