Ver Mensaje Individual
  #14 (permalink)  
Antiguo 17/02/2014, 22:17
Avatar de nup_
nup_
 
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 14 años
Puntos: 32
Respuesta: Encriptar contraseñas un problema para futuro

Hola:

No tienes porq aplicar sha1 al password, simplemente concaténalo con el salt y eso es suficiente.
Después haces varias iteraciones de "hasheo" (en el ejemplo hay 1000 pero puedes llegar a 20000).
En la BD guardas el hash y el salt, la cantidad de iteraciones la puedes poner constante para toda la aplicación.
El proceso sería asi:
Código PHP:
Ver original
  1. function get_hash( $password, $salt, $iterations )
  2. {
  3.     $hash = hash('sha512', $password . $salt);
  4.     for ( $i = 0 ; $i < $iterations ; $i++ )
  5.         $hash = hash('sha512', $hash . $i);
  6.     return $hash;
  7. }
  8.  
  9. // Para salvar los datos de un usuario en la BD
  10. //   guardas el hash y el salt
  11. $salt = get_random_salt(); // Funcion tuya, ver despues
  12. $hash = get_hash( $password, $salt, 1000 );
  13. // INSERT INTO usertable( username, hash, salt ) VALUES ....
  14.  
  15. // Para autenticar un usuario
  16. $salt_db = // el salt guardado en la BD para ese user
  17. $password_db = // el salt guardado en la BD
  18. if ( get_hash($password_db, $salt_db, 1000) == get_hash($password, $salt, 1000) )
  19.     // Autenticado
  20. else
  21.     // Denegado

Para generar el salt aleatorio tienes varias variantes:
- usar la librería mcrypt
- extraer datos aleatorios de /dev/urandom
- generar una cadena aleatoria usando mt_rand()

Recomiendo cualquiera de las 2 primeras:
Código PHP:
Ver original
  1. // Usando la librería mcrypt
  2. function get_random_salt()
  3. {
  4.     $size = 300;
  5.     return mcrypt_create_iv($size, MCRYPT_DEV_URANDOM);
  6. }
  7.  
  8. // Usando /dev/urandom
  9. function get_random_salt()
  10. {
  11.     $size = 300;
  12.     $fh = fopen('/dev/urandom','rb');
  13.     $salt = fread($fh,$size);
  14.     fclose($fh);
  15.     return $salt;
  16. }

slds;

nup_