Al agregar valores de sal a un valor hash para algo como una contraseña que no se puede almacenar en texto sin formato, ¿cuál es el mejor lugar para obtener los valores de sal? Por contexto, supongamos que esto es para contraseñas en un inicio de sesión de página web.
12
Respuestas:
Por lo general, tengo una columna
created TIMESTAMP
en una tabla de usuario para poder ver cuándo se registró el usuario. No me gusta agregar una columna adicional para Salt, así que uso la columna de marca de tiempo como salt:fuente
¿Importa?
La sal tiene dos propósitos. Hace que sea poco práctico usar tablas grandes de contraseñas prehavadas ("tablas del arco iris") y hace que las contraseñas idénticas se vean diferentes en la lista de hashes. Hacer que las contraseñas idénticas se vean diferentes ayuda a evitar un problema en el que varias personas están usando una contraseña en particular, que presumiblemente es una contraseña débil común.
Por lo tanto, cada cuenta debe tener su propia sal única, y las sales no deben ser demasiado predecibles, en el sentido de que no habrá un grupo de sales que puedan ocurrir. (Si muchos sitios comenzaron en 1 y siguieron contando, los malos podrían construir tablas de arco iris que incluyen sales de bajo número, por ejemplo). No tienen que ser aleatorias en ningún sentido que no sea generalmente impredecible. No son más secretos que el hash en sí mismo, por lo que no necesitan ser específicamente cuestionables.
Use cualquier método conveniente para generar una sal. Si hay muchos valores de sal potenciales (los primeros sistemas Unix frecuentemente usaban dos bytes, para un posible número de 65536) en comparación con el número de cuentas, la asignación semialeatoria casi nunca daría un sal duplicado.
fuente
Cada vez que desee almacenar una nueva contraseña (registro, restablecimiento de contraseña, actualización de contraseña), una buena técnica es:
for i in (0...65536) { password = hmac(password) }
fuente
Aproveche el marco. En .NET podría usar el RNGCryptoServoiceProvider ...
Otros marcos deberían tener clases similares que pueda aprovechar. Para lograr la aleatoriedad, el software a menudo emplea al usuario en comparación con
Random
lo mencionado anteriormente. TrueCrypt utiliza una opción aleatoria para mover un mouse en un área definida para proporcionar sal. Se reduce a sus necesidades específicas y nivel de seguridad; ya que tu sal simplemente podría ser!@#$%
.fuente
Se genera un servidor salado y se lo asigna a una cuenta de usuario después de su creación. Mejor use alguna API de generación de cifrado disponible con su marco, pero en principio cualquier secuencia servirá.
Por lo general, las cosas se almacenan así:
Ejemplo:
PasswordHashWithSalt =
A15CD9652D4F4A3FB61A2A422AEAFDF0DEA4E703 j5d58k4b56s8744q
fuente
Use bcrypt y lea este artículo ya que los hashes normales por sí solos no son una protección seria en estos días.
Considere utilizar el protocolo de contraseña de conocimiento cero SDR que tiene muchas bibliotecas de código abierto y no tiene patentes.
SDR requiere sal y el mejor lugar para conseguirlo es el cliente; cronometra sus pulsaciones de teclas, movimientos del mouse, hash sus variables de entorno, números aleatorios, tiempos de creación de archivos en su carpeta temporal, para que sal al final de una manera impredecible lejos de su servidor. SDR toma la sal, una clave grande, la contraseña de usuario y genera una clave de verificación. No almacena una contraseña, nunca sale de su máquina, pero puede verificar que tengan la contraseña que va con la clave del verificador y la sal. Es inmune al hombre en el medio y los ataques de diccionario. Cifre las claves y la sal en la columna de la base de datos solo para estar seguro.
fuente