2010-10-20 13 views
6

Tengo una contraseña que se transfiere desde mi aplicación de iPhone a la base de datos a través de un script php, user.php.¿Codifica la contraseña antes de almacenarla en la base de datos?

El pase $ variable se encuentra por lo siguiente:

$pass = str_replace("'", "", $_REQUEST['pass']); 

Como puedo cifrar este antes de que sea insertado en mi base de datos? He leído un poco sobre las diferentes técnicas, pero estoy buscando la mejor manera de manejar esto.

Gracias a todos.

+0

no relacionado: utilice el ingreso de entrada adecuado y no confíe en 'str_replace' para filtrar todos los apóstrofes – knittl

+0

que proviene de una aplicación de iPhone, pasa a través de la URL de la secuencia de comandos. – BigMike

+0

También vea Openwall's [Portable PHP password hashing framework] (http://www.openwall.com/phpass/) (PHPass). Está endurecido contra una serie de ataques comunes a las contraseñas de los usuarios. – jww

Respuesta

6

Si no se preocupan por recuperar el valor de la contraseña real (desde el valor cifrado de base de datos), puede ejecutar un algoritmo de cifrado de una vía en él (como sha1: http://php.net/manual/en/function.sha1.php). Esta función devolverá una cadena de longitud específica (hash) que no se puede usar para encontrar la cadena original (teóricamente). Es posible que dos cadenas diferentes puedan crear el mismo hash (llamado colisión) pero esto no debería ser un problema con las contraseñas.
Ejemplo: $pass = sha1($_REQUEST['pass']);

Una cosa, para que sea un poco más seguro es añadir una sal con el hash y ejecutar la función hash de nuevo. Esto hace que sea más difícil generar un hash de contraseña maliciosamente ya que el valor de sal solo se maneja en el lado del servidor.
Ejemplo: $pass = sha1(sha1($_REQUEST['pass']).sha1("[email protected]$#(%"));

+1

Esta no es una sal adecuada. Una sal no es lo mismo para cada usuario de una aplicación. En cambio, es específico del usuario. – middus

+0

Utilicé este. Está funcionando y no necesita ser súper críptico. – BigMike

1

más básico: hash con MD5 o SHA1

$newpass = md5($_REQUEST['pass']); 

o

$newpass = sha1($_REQUEST['pass']); 

Recientemente he comenzado a almacenar el nombre de usuario hash y, por lo intentos de conexión son seguras utilizando sólo hash de datos para las comparaciones.

Puede "saltear" los hashes con datos adicionales, de modo que si se ponen en peligro, no se puede encontrar el valor (intente googlear palabras simples) ... es decir, use una cadena para modificar el hash estándar como md5("mySiteSalt!!" . $_REQUEST['pass']); o algo más avanzado.

+2

md5 no es para el cifrado. – Chris

+1

@Chris Para el registro, el hashing es una forma de cifrado (aunque de una sola dirección). Independientemente, MD5 NUNCA se debe utilizar para almacenar contraseñas. Con las tablas del arcoíris de hoy, es tan bueno como el texto sin formato. – mattbasta

+0

Nunca dijo hash no es una forma de encriptación, acabo de decir md5 no es para encriptación. Entonces, ¿por qué estás sugiriendo usar md5 para "encriptar" las contraseñas del OP? Al menos explique en su respuesta esto antes de crear otro usuario con intrincada sensación de seguridad utilizando md5 para el cifrado de contraseñas. – Chris

0

Debe utilizar SHA1 para discutir sus contraseñas para su almacenamiento en la base de datos. Es el más simple, pero más eficaz manera de almacenar contraseñas:

$password = sha1($password); 

También es excepcionalmente seguro.Aunque la integridad de la misma está empezando a aumentar, es bastante fácil actualizar esta función a SHA-256 (que es increíblemente segura).

+0

SHA1 es demasiado rápido. Ver el enlace en mi respuesta. – middus

+0

@middus Sin duda es demasiado rápido, pero usa un 30% más de espacio que MD5, por lo que al menos las tablas son más grandes. Además, si alguien tiene acceso suficiente a su base de datos para recopilar las contraseñas hash, es probable que puedan robar una gran cantidad de información no encriptada. SHA1 no es "excelente", pero funcionará en el 95% de los escenarios. – mattbasta

0

Para descubrir por qué md5, sha1 y sus amigos rápidos podrían no ser una buena idea, debería leer la publicación Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes de Thomas Ptacek. Lo esencial:

Por último, hemos aprendido que si queremos almacenar contraseñas de forma segura, tenemos tres opciones razonables : Esquema MD5 de PHK, Bcrypt esquema de Provos-Maziere, y SRP. Aprendimos que la opción correcta es Bcrypt.

Nota: es PHK, no php.

2

Primero, debe crear una sal de usuario aleatorio. Luego debe almacenar eso y el hash de contraseña en la base de datos.

$salt = md5(unique_id().mt_rand().microtime()); 
$pass = sha1($salt.$_REQUEST['pass']); 

y guarde los $ sal y $ pase en la base de datos. A continuación, cuando se van a iniciar sesión miras a su fila y comprobar el hash:

$user = query('SELECT * FROM `user` WHERE username = ?', array($_REQUEST['username'])); 

if($user) 
{ 
    // If the password they give maches 
    if($user->pass === sha1($user->salt. $_REQUEST['pass'])) 
    { 
     // login 
    } 
    else 
    { 
     // bad password 
    } 
} 
else 
{ 
    // user not found 
} 

Creación de una sal de usuario para cada cuenta asegura tablas de arco iris son inútiles y cualquier persona que rompe en su servidor tendría que fuerza bruta cada contraseña .

Cuestiones relacionadas