php - tabla - ¿Cómo creo y almaceno contraseñas de md5 en mysql?
guardar contraseñas mysql php (9)
Probablemente sea una pregunta muy nueva, pero he estado leyendo y he encontrado algunas dificultades para entender la creación y el almacenamiento de contraseñas. Por lo que he leído las contraseñas de md5 / hash son las mejores maneras de almacenarlas en una base de datos. Sin embargo, ¿cómo me gustaría crear esas contraseñas en primer lugar?
Entonces, digamos que tengo una página de inicio de sesión con el usuario bob y la contraseña bob123. ¿Cómo puedo 1. ingresar la contraseña de bobs en la base de datos para comenzar con (hash) 2. ¿Cómo recupero y confirmo la contraseña hash?
Gracias
¿Por qué no usas el hasher de contraseña incorporado de MySQL:
http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html
mysql> SELECT PASSWORD(''mypass'');
+-------------------------------------------+
| PASSWORD(''mypass'') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
para comparación usted podría algo como esto:
select id from PassworTable where Userid=''<userid>'' and Password=PASSWORD(''<password>'')
y si devuelve un valor, entonces el usuario es correcto.
Edite el 2017/11/09: asegúrese de revisar la respuesta de O Jones.
En primer lugar, MD5 no es el mejor método de hashing que podría usar para este intento sha256 o sha512
Dicho esto, utilicemos hash(''sha256'')
lugar de md5()
para representar la parte de hash del proceso.
Cuando creas un nombre de usuario y contraseña por primera vez, hash la contraseña sin procesar con algo de sal (algunos caracteres adicionales aleatorios se agregarán a cada contraseña para hacerlos más largos / más fuertes).
Puede verse algo como esto desde el formulario de creación de usuario:
$escapedName = mysql_real_escape_string($_POST[''name'']); # use whatever escaping function your db requires this is very important.
$escapedPW = mysql_real_escape_string($_POST[''password'']);
# generate a random salt to use for this account
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$saltedPW = $escapedPW . $salt;
$hashedPW = hash(''sha256'', $saltedPW);
$query = "insert into user (name, password, salt) values (''$escapedName'', ''$hashedPW'', ''$salt''); ";
Luego, al iniciar sesión se verá algo como esto:
$escapedName = mysql_real_escape_string($_POST[''name'']);
$escapedPW = mysql_real_escape_string($_POST[''password'']);
$saltQuery = "select salt from user where name = ''$escapedName'';";
$result = mysql_query($saltQuery);
# you''ll want some error handling in production code :)
# see http://php.net/manual/en/function.mysql-query.php Example #2 for the general error handling template
$row = mysql_fetch_assoc($result);
$salt = $row[''salt''];
$saltedPW = $escapedPW . $salt;
$hashedPW = hash(''sha256'', $saltedPW);
$query = "select * from user where name = ''$escapedName'' and password = ''$hashedPW''; ";
# if nonzero query return then successful login
Inserción:
INSERT INTO ... VALUES (''bob'', MD5(''bobspassword''));
recuperación:
SELECT ... FROM ... WHERE ... AND password=md5(''hopefullybobspassword'');
Es como lo harías directamente en las consultas. Sin embargo, si su MySQL tiene habilitado el registro de consultas, entonces el texto simple de las contraseñas se escribirá en este registro. Entonces ... querría hacer la conversión MD5 en su script, y luego insertar ese hash resultante en la consulta.
No soy sorprendente en PHP, pero creo que esto es lo que haces:
$ contraseña = md5 ($ contraseña)
y $password
sería $_POST[''password'']
o lo que sea
PHP tiene un método llamado md5 ;-) Sólo $ password = md5 ($ passToEncrypt);
Si está buscando en un SQL, u también puede usar un Método MySQL MD5 () ...
SELECT * FROM user WHERE Password=''. md5($password) .''
o SELECT * FROM ser WHERE Password = MD5 (''. $ password.'')
Para insertarlo puedes hacerlo de la misma manera.
Para aumentar aún más la seguridad, puede tener cifrado md5 junto con dos cadenas de sal diferentes, una sal estática definida en el archivo php y luego una sal única más generada de forma aleatoria para cada registro de contraseña.
Aquí es cómo puede generar sal, cadena md5 y almacenar:
$unique_salt_string = hash(''md5'', microtime());
$password = hash(''md5'', $_POST[''password''].''static_salt''.$unique_salt_string);
$query = "INSERT INTO users (username,password,salt) VALUES(''bob'',''".$password."'', ''".$unique_salt_string."'');
Ahora tiene una sal estática, que es válida para todas sus contraseñas, que se almacena en el archivo .php. Luego, en la ejecución del registro, genera un hash único para esa contraseña específica.
Todo esto termina con: dos contraseñas que se escriben exactamente igual, tendrán dos hashes diferentes. El hash único se almacena en la base de datos junto con la identificación actual. Si alguien toma la base de datos, tendrá cada sal única para cada contraseña específica. Pero lo que no tienen es su sal estática, que hace las cosas mucho más difíciles para todos los "piratas informáticos".
Esta es la forma en que verifica la validez de su contraseña en login.php, por ejemplo:
$user = //username input;
$db_query = mysql_query("SELECT salt FROM users WHERE username=''$user''");
while($salt = mysql_fetch_array($db_query)) {
$password = hash(''md5'',$_POST[''userpassword''].''static_salt''.$salt[salt]);
}
Este método es muy poderoso y seguro. Si desea utilizar el cifrado sha512, simplemente coloque eso dentro de la función hash en lugar de md5 en el código anterior.
Por favor, no utilice MD5 para el hashing de contraseñas. Dichas contraseñas se pueden descifrar en milisegundos. Seguro que los criminales cibernéticos los castigarán.
PHP ofrece un subsistema de hashing de contraseña de alta calidad y prueba para el futuro basado en un salt aleatorio confiable y varias rondas de cifrado Rijndael / AES.
Cuando un usuario proporciona una contraseña por primera vez, puede hacer un hash de esta manera:
$pass = ''whatever the user typed in'';
$hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );
Luego, almacene $hashed_password
en una columna varchar(255)
en MySQL. Más adelante, cuando el usuario quiera iniciar sesión, puede recuperar la contraseña de hash de MySQL y compararla con la contraseña que el usuario ofreció para iniciar sesión.
$pass = ''whatever the user typed in'';
$hashed_password = ''what you retrieved from MySQL for this user'';
if ( password_verify ( $pass , $hashed_password )) {
/* future proof the password */
if ( password_needs_rehash($hashed_password , PASSWORD_DEFAULT)) {
/* recreate the hash */
$rehashed_password = password_hash($pass, PASSWORD_DEFAULT );
/* store the rehashed password in MySQL */
}
/* password verified, let the user in */
}
else {
/* password not verified, tell the intruder to get lost */
}
¿Cómo funciona esta prueba de futuro? Las futuras versiones de PHP se adaptarán para hacer coincidir el cifrado más rápido y más fácil. Si es necesario repetir las contraseñas para hacerlas más difíciles de descifrar, la futura implementación de la función password_needs_rehash()
lo detectará.
No reinventes el pinchazo. Utilice un código fuente abierto diseñado y revisado por profesionales para la seguridad.
Tienes que razonar en términos de contraseña hased:
almacene la contraseña como md5(''bob123'');
Cuando Bob está registrado en tu aplicación
$query = "INSERT INTO users (username,password) VALUES(''bob'',''".md5(''bob123'')."'');
entonces, cuando bob está logueando:
$query = "SELECT * FROM users WHERE username = ''bob'' AND password = ''".md5(''bob123'')."'';
uso obvioulsy variables para nombre de usuario y contraseña, estas consultas son generadas por php y luego se pueden ejecutar en mysql
simplemente obtenga el hash siguiendo la línea y guárdelo en la base de datos:
$encryptedValue = md5("YOUR STRING");