La seguridad de la función PASSWORD en MySQL

5

La función PASSWORD en MySQL se puede traducir al código en php:

function mysql_password($string){
    $pass = strtoupper(
            sha1(
                    sha1($string, true)
            )
    );
    $pass = '*' . $pass;
    return $pass;
}

que devuelve un hash de 41 caracteres.

Me preocupa esta función porque si ejecuto:

SELECT PASSWORD('securepassword');

en cualquier dispositivo devuelve el mismo hash:

  

* 214C2FAF32F109AE748170BFABDDFB9B05889E64

Seguramente, eso significa que si se infringe mi base de datos, un infiltrado puede crear fácilmente una tabla de arco iris con una carga de contraseñas populares y hacer coincidir los hashes. ¿No debería preocuparme por esto?

¿Esperaba que la función CONTRASEÑA fuera exclusiva de cada dispositivo? ¿Cómo haría para que sea único para cada dispositivo?

    
pregunta maxisme 22.02.2017 - 13:22
fuente

3 respuestas

3
  

Seguramente eso significa que si se infringe mi base de datos, un infiltrado puede crear fácilmente una tabla de arco iris con una carga de contraseñas populares y hacer coincidir los hashes.

Eso es correcto.

Los hashes no difieren de usuario a usuario. Esto significa que un atacante puede calcular un hash una vez y compararlo con los hashes de todos los usuarios. Una sal haría esto imposible.

De hecho, los hashes no difieren en absoluto, por lo que un atacante podría calcular muchos hashes incluso antes de acceder a su sistema.

Otro problema es que la función hash utilizada (2x SHA1) es muy rápida, y un ataque de fuerza bruta puede probar muchas contraseñas en poco tiempo. Con el hardware básico, sería posible probar 3,000,000,000 de contraseñas por segundo .

Este método de hash de contraseña no cumple con los estándares de seguridad modernos.

    
respondido por el Sjoerd 22.02.2017 - 14:14
fuente
1

Dado el hecho de que no se usa sal única, es normal (¡y extremadamente necesario!) que la misma función de hashing aplicada en la misma cadena produzca los mismos resultados cada vez.

Las funciones hash son deterministas por definición

Por cierto, la prevención del uso de Rainbow Tables se realiza gracias a la salazón, ya que la cadena de hash es siempre diferente (dado que las sales únicas deben ser)

=====

editar: Para responder a la pregunta real de manera más exhaustiva (la parte "única para cada dispositivo"): si el hash fuera único para cada dispositivo, sería imposible realizar una migración de la base de datos en otra máquina, ya que todos los hashes no coincidirían, en el caso de campos utilizados para las contraseñas, los usuarios ya no podrían iniciar sesión: P Ciertamente puedes imaginar otros problemas similares (bases de datos distribuidas, ..)

    
respondido por el niilzon 22.02.2017 - 13:33
fuente
0
  

Esperaba que la función CONTRASEÑA fuera exclusiva de cada dispositivo

No hay suficientes algoritmos seguros para redondear. Por lo general, esto se resuelve utilizando un único sal por cuenta, pero si quisiera una seguridad más débil, supongo que podría tener un sal específico para el dispositivo.

MySQL admite certificados de cliente para autenticación fuera de la caja junto con autenticadores de complementos y hay varios disponible como estándar (incluido el soporte para Unix PAM ).

(MariaDB también tiene las mismas API)

    
respondido por el symcbean 01.03.2017 - 14:22
fuente

Lea otras preguntas en las etiquetas