Una construcción como hash(site_name + pw)
generará una contraseña segura siempre que la contraseña sea alta entropía y el hash tenga suficientes bits (por ejemplo, 128+ bits que tendrá su hash criptográfico estándar; simplemente no use hashes no criptográficos como crc32). Si usa algo como pw = password123
que se adivina fácilmente, entonces un atacante sofisticado podrá descubrir su esquema al ver su contraseña en un sitio que controlan y luego forzar su contraseña para todos los demás sitios (por ejemplo, si su la contraseña para example.com es md5("examplepassword123")
puede ser posible revertirla probando contraseñas de la forma md5(site_name + pw)
- puede generar miles de millones de hash md5 por segundo por computadora. Es una mala idea confiar en que un atacante no conozca su esquema de generación de contraseñas - en lugar de eso, debe confiar en que sus contraseñas reales tengan una alta aleatoriedad intrínseca (consulte Principio de Kerckhoffs ).
Sin embargo, si usas algo como bcrypt, estarás bien con una contraseña débil ya que bcrypt crea un sal aleatorio de 128 bits que proporciona más que suficiente entropía para evitar que incluso la contraseña más débil sea razonable (asumiendo que se usa la sal) difiere entre tus hashes). Tenga en cuenta que tendrá que almacenar esta sal creada al azar para poder volver a iniciar sesión, por lo que en este punto probablemente habría sido más sencillo utilizar una contraseña generada de forma completamente aleatoria para cada sitio web que visite.
Para dar un ejemplo con bcrypt usando python (en el intérprete de ipython):
In [1]: import bcrypt
In [2]: bcrypt.hashpw('amazonpassword123', bcrypt.gensalt(10))
Out[2]: '$2b$10$//rLpdWc/0hljdOf90366u1uaRch7q59AxF0qcodHvDckO1nd..ky'
In [3]: bcrypt.hashpw('amazonpassword123', bcrypt.gensalt(10))
Out[3]: '$2b$10$eUsCtvQ9mvYA2qAEShaqjOqgYogRP4mohEag5bm3Hls10JPSQxU4y'
In [4]: bcrypt.hashpw('amazonpassword123', Out[2])
Out[4]: '$2b$10$//rLpdWc/0hljdOf90366u1uaRch7q59AxF0qcodHvDckO1nd..ky'
Tenga en cuenta que el hash de la misma cosa dos veces con bcrypt genera un hash completamente diferente, ya que utilizaron dos sales diferentes creadas al azar (con 2 ^ 10 rondas de hashing); Es por esto que Out[2] != Out[3]
. Esto no es problemático cuando se comprueban contraseñas contra un hash bcrypt (ya que el hash contiene el salt), por lo que puede proporcionar el hash almacenado en la base de datos para usarlo como sal y luego verificar que coincida con el hash almacenado; por eso Out[2] == Out[4]
.
El otro problema del que debe preocuparse es de los sitios que truncan su contraseña en silencio. El uso de, por ejemplo, un hash bcrypt completo, donde los primeros siete caracteres son $2b$<lg(number of rounds)>$
puede debilitar gravemente su contraseña. Por ejemplo, una VPN proporcionada por un proveedor conocido que uso para el trabajo trunca mi contraseña de usuario a 8 caracteres (aunque me permite escribir contraseñas mucho más largas, solo verifica los primeros 8).