¿Es seguro usar la función ENCRYPT () en MySQL para hash de contraseñas?

3

Estoy ejecutando un servidor ProFTPD en Ubuntu 12.04 y hago la autenticación del usuario con MySQL. Estoy buscando una forma segura de hash de contraseñas.

Hay muchas funciones hash integradas en MySQL, pero muchos de ellos están en desuso, como MD5 o SHA1. La mejor función hash incorporada en MySQL que vi fue encrypt , que usa la función Unix crypt . Un aspecto positivo de encrypt es que el hash podría generarse con sal.

Según el manual de MySQL , encrypt está en desuso Porque usa DES y se eliminará en una versión futura. Pero de acuerdo con esta pregunta solo la versión antigua de la función Unix crypt Utiliza DES y está desactualizado. Las versiones más recientes de la función crypt deberían estar bien.

¿Recomiendas usar encrypt en MySQL? ¿ encrypt crea un hash seguro?

    
pregunta Wubi 08.02.2017 - 08:55
fuente

1 respuesta

3

Sí, es posible hacer que la función de cifrado de MySQL sea más segura.

Como mencionaste, ENCRYPT llama a crypt internamente. La función crypt usa el cifrado DES de forma predeterminada, lo cual es inseguro. Sin embargo, se puede hacer que use otros algoritmos pasando valores específicos como la sal. Por ejemplo, pasar una sal que comience con $6$ usará una variación en SHA512 en los sistemas de soporte.

mysql> SELECT ENCRYPT('abc', '$6$abc');
+-----------------------------------------------------------------------------------------------+
| ENCRYPT('abc', '$6$abc')                                                                      |
+-----------------------------------------------------------------------------------------------+
| $6$abc$feY2G1TnANZ0KTBaV0Kkb3kO0521w9Wfvr8bW8wL0T11tXMxEhkG9poIhCuNFR3zasFDn.iplGDXaEJxlLwPt0 |
+-----------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

Como puede ver, este hash es significativamente más largo que el que se obtiene con el DES predeterminado. Sin embargo, tenga en cuenta que debe crear un salt al azar si crea una nueva contraseña.

SELECT ENCRYPT('abc', CONCAT('$6$', SHA2(RANDOM_BYTES(64), '256')));

Para verificar la contraseña, puedes usar todo el hash como salt:

SELECT ENCRYPT('abc', '$6$e1c69ed016381250$5g0Bzbh29DWXdCdy5m0IhKolTwCqZXpElB2ISK.mUwe9ic.oA6zXoZ5CAiuASg8GYKGwljSCJrnxSZ.f76PFW/');
respondido por el Sjoerd 08.02.2017 - 11:04
fuente

Lea otras preguntas en las etiquetas