2011-07-15 10 views
6

Estoy trabajando en un web administration module for mailservers (es de código abierto si desea echar un vistazo).¿Cómo generar de forma segura hashes SSHA256 o SSHA512 en PHP?

Para eso, necesito poder generar contraseña hash legible por Dovecot. Como described on their wiki, su esquema de hashing de contraseña recomendado es SSHA256 (el S adicional es para salados).

También se explicó que esto podría ser razonablemente fácil de implementar con algo así como el código PHP:

$salt = 'generate_a_salt_somehow'; 
$hash = hash('sha256', $password . $salt); 

Sin embargo, por lo que he leído acerca de la criptografía, que es una manera bastante ingenua para generar hashes salados , pero si lo haces mal cuando typing A-E-S in your source code, pensé que lo mismo podría ser cierto en este caso.

Así que si tiene una visión de la criptografía, me encantaría saber sobre la manera más segura de hacerlo, ya sea mcrypt, mhash o lo que sea.

+0

Oh sí, y una manera segura de hacer preparar un hash primero también sería bueno :) – mikl

+0

http://php.net/manual/en/function.ha sh-hmac.php –

+0

¿El hash tiene que coincidir con otras implementaciones? ¿O es la originalidad por sitio aceptable? – wallyk

Respuesta

8

La página wiki Palomar se ha vinculado a lo que explica el formato de hash exacta usa Dovecot es. Usted no tiene ninguna opción en la materia - Palomar tiene sus expectativas sobre lo que el hash se verá así, por lo que tiene que jugar con sus reglas:

Para la mayoría de los esquemas de contraseñas saladas (SMD5, SSHA *) la sal se almacena después del hash de contraseña y su longitud puede variar. Al crear la contraseña, agregue la sal después de la contraseña de texto simple, por ejemplo, SSHA256 (pase, sal) = SHA256 (pase + sal) + sal.

lo tanto, una función de generación de contraseña apropiada en PHP podría ser:

$hash = "{SSHA256}" . base64_encode(hash('sha256', $password . $salt) . $salt); 
+2

Al principio no pude hacer que esto funcionara, pero resultó que necesitaba establecer el parámetro '$ raw_output' en hash() en true para que funcione, porque de lo contrario, codificaría en base64 número ya codificado en hexadecimal De lo contrario, gracias por el consejo :) – mikl

5

contraseña función de generación en PHP:

$hash = "{SSHA256}".base64_encode(hash('sha256', $password.$salt, true).$salt); 

necesariamente "verdadero" - el tercer parámetro ...

+0

No tengo ni idea por qué el suyo no está marcado como la respuesta correcta. Es exactamente lo que se requiere para que esto funcione. – Josh

Cuestiones relacionadas