¿Solución para calcular y almacenar un sal de hash en una aplicación de código abierto?

2

Estaba viendo este video sobre cómo NO almacenar una contraseña. También leí esta pregunta que es muy similar. Mi pregunta es ligeramente diferente en el hecho de que estoy escribiendo una aplicación de seguridad de código abierto, por lo que cualquier persona que lea el código fuente de mis aplicaciones podrá encontrar el método de cálculo y almacenamiento de un objeto de sal.

¿Cuál es una buena solución para almacenar una sal en este caso?

    
pregunta CS2020 26.09.2017 - 02:39
fuente

3 respuestas

1

Parece que piensa que el algoritmo de sal y / o salado y hash debe mantenerse en secreto. Ellos no. La sal solo protege contra escenarios de amenazas muy específicos.

Recuerde que calcular un hash en un valor siempre devuelve el mismo valor de hash (de lo contrario, sería inútil). Pero eso significa que un atacante puede usar esa propiedad para probar los valores de hash en su base de datos mediante la comprobación de contraseñas de hashing. Si su suposición tiene el mismo valor que un hash en la tabla, su suposición fue correcta y él conoce esa contraseña. La salazón ayuda a evitar que esto sea un problema de dos maneras.

  1. Al agregar un salt largo y aleatorio a la contraseña antes del hash, protege contra alguien que calcula previamente los valores de hash de las conjeturas de contraseña. (Esto se denomina "ataque de la tabla arco iris"; puede conectarse y comprar un disco duro de 1TB con miles de millones de hashes precalculados que ya se encuentran en una tabla de búsqueda).

  2. Al usar un salt único para cada contraseña, protege contra alguien que detecta colisiones en su base de datos. Sin usar un salt único para cada contraseña, si mi contraseña era ABC y estaba hash a 123, y si también usaba ABC como su contraseña, también lo haría a 123. Cualquiera que busque en la base de datos verá que ambos compartimos Una contraseña común.

En ningún caso, el algoritmo de sal y hash debe mantenerse en secreto para preservar estas protecciones, de modo que pueda abrir todo este trabajo de fuente.

Para mayor seguridad, algunas personas agregan lo que se llama "pimienta" a este algoritmo; "pimienta" es un nombre lindo para un valor de sal común que se aplica a todas las contraseñas en un sistema y se mantiene en secreto.

Lo que también es importante para proteger sus contraseñas en un escenario de incumplimiento es que el algoritmo de hashing de contraseñas sea computacionalmente costoso. Esto ayuda a prevenir ataques de fuerza bruta, porque el atacante generalmente no puede gastar suficiente tiempo de CPU para probar miles de millones de conjeturas. La forma de lograrlo es mediante la repetición de un algoritmo de hash criptográficamente seguro. Una computadora moderna con una tarjeta GPU puede calcular 10s de billones de hashes SHA-1 por segundo. Si usó SHA-1 como el algoritmo de hash de contraseña, eso significa que un atacante podría probar 10 mil millones de conjeturas de contraseña por segundo. Al utilizar una función de hashing de contraseñas como PBKDF2, repite el hash miles de veces, asegurando que el atacante solo pueda probar unos pocos cientos de intentos por segundo.

    
respondido por el John Deters 27.09.2017 - 07:51
fuente
0

Las sales generalmente se almacenan con contraseñas (generalmente en el campo al lado de ellas). El razonamiento es simple, el software requiere la sal para determinar si el salt + algorithm + provided data = stored hash .

Lo que estás describiendo es Seguridad a través de la oscuridad , y es un gran no no en el mundo de hoy. Simplemente no funciona, y proporciona poca o ninguna seguridad significativa sobre la solución.

La seguridad del almacenamiento de su contraseña debe provenir de:

  • Recordar a los usuarios finales que elijan contraseñas seguras.
  • Usar un algoritmo apropiado para almacenar la contraseña.
  • Salting, usando una sola vez, por contraseña cadena / número para evitar ataques previos al cálculo.
  • Asegurarse de que la contraseña "clara" no se almacene en la memoria.
  • Usar el menor privilegio para acceder a una confirmación de solo lectura de la coincidencia de hash.
  • Cifre el almacenamiento de hash en reposo o en el cable.
respondido por el dark_st3alth 26.09.2017 - 04:03
fuente
0

Sobre la base de su pregunta, ¿estoy asumiendo que planea almacenar la sal en su código fuente y le preocupa que alguien pueda recuperar esa sal?

En este caso hay algunos conceptos erróneos. En primer lugar, una sal es un valor no secreto. No pretende ser secreto, es simplemente un valor único para evitar que los ataques de arco iris sean eficientes. Una sal necesita tener las siguientes propiedades:

  • Globalmente único (es decir, seguro generado de forma aleatoria de tal manera que no haya otra contraseña usando el mismo salt)
  • La sal debe tener una longitud de 128 bits

La sal se almacena en la base de datos junto a la contraseña de una manera sencilla.

Si desea saber más, escribí una publicación de blog hace un tiempo sobre el hashing de contraseña seguro que se puede encontrar aquí: enlace

EDIT

Basándome en su comentario a continuación, déjeme explicarlo: el algoritmo de hash y la sal no son secretos, puede filtrarlos de manera segura sin comprometer la seguridad del sistema. Solo debe asegurarse de que su algoritmo de hash sea aceptable (solo las implementaciones de algoritmos de hash que se pueden utilizar para el hashing de contraseñas son seguras). En general, ni siquiera necesitas cuidar de la sal por ti mismo. La mayoría de los frameworks que soportan algoritmos de hashing como PBKDF2, bcrypt, argon2 o scrypt se harán cargo de esto por usted.

    
respondido por el Lucas Kauffman 26.09.2017 - 05:18
fuente

Lea otras preguntas en las etiquetas