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 originalfunction get_hash( $password, $salt, $iterations )
{
$hash = hash('sha512', $password . $salt); for ( $i = 0 ; $i < $iterations ; $i++ )
$hash = hash('sha512', $hash . $i); return $hash;
}
// Para salvar los datos de un usuario en la BD
// guardas el hash y el salt
$salt = get_random_salt(); // Funcion tuya, ver despues
$hash = get_hash( $password, $salt, 1000 );
// INSERT INTO usertable( username, hash, salt ) VALUES ....
// Para autenticar un usuario
$salt_db = // el salt guardado en la BD para ese user
$password_db = // el salt guardado en la BD
if ( get_hash($password_db, $salt_db, 1000) == get_hash($password, $salt, 1000) )
// Autenticado
else
// 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// Usando la librería mcrypt
function get_random_salt()
{
$size = 300;
}
// Usando /dev/urandom
function get_random_salt()
{
$size = 300;
$fh = fopen('/dev/urandom','rb'); $salt = fread($fh,$size); return $salt;
}
slds;
nup_