Pregunta

La empresa para la que trabajo ha adquirido un contrato de soporte para un gran sistema de procesamiento de pedidos. Como parte de la auditoría inicial del sistema, noté que las contraseñas almacenadas en la base de datos eran en realidad el código hash de la contraseña.

Esencialmente:

string pwd = "some pasword";
string securePwd = pwd.GetHashCode();

Mi pregunta es, ¿qué tan seguro o no es esto?

No me siento cómodo con eso, pero no sé lo suficiente sobre cómo funciona GetHashCode. Preferiría usar algo como un hash MD5, pero si pierdo el tiempo no me molestaré.

¿Fue útil?

Solución

GetHashCode devuelve un entero de 32 bits como valor de hash. Teniendo en cuenta la birthday paradox , no es un valor hash lo suficientemente largo debido a la probabilidad relativamente alta de colisiones , incluso si fue diseñado explícitamente para ser resistente a las colisiones, que no lo es.

Debería optar por SHA256 u otra función hash criptográficamente segura diseñada para manejar dicha tarea.

Para almacenar contraseñas, solo usar una función hash simple no es suficiente. Debes añadir un poco de " sal " por usuario e iterar el tiempo suficiente para que sea computacionalmente costoso para la fuerza bruta. Por lo tanto, debe usar algo como bcrypt, scrypt , PBKDF2, con un gran número de iteraciones.

Otros consejos

Debes utilizar un hash criptográficamente fuerte con sal, como SHA256Managed .

Jeff Attwood tiene algunas buenas publicaciones sobre este tema:

Cracking de Rainbow Hash

Probablemente esté almacenando contraseñas incorrectamente

No solo es inseguro, sino que también está sujeto a cambios:

http://netrsc.blogspot.com/2008/ 08 / gethashcode-differs-on-systems.html

El valor devuelto por GetHashValue para una entrada dada ha cambiado en el pasado.

No hay garantía de que sea igual entre ejecuciones diferentes de la aplicación.

Recomiendo usar BCrypt en su lugar. Como ya han dicho otros, usar GetHashCode para las contraseñas no es una buena idea.

GetHashCode definitivamente no fue diseñado para ser usado de esta manera ya que la implementación no garantiza diferentes retornos de hash para diferentes objetos. Esto significa que potencialmente múltiples contraseñas podrían producir el mismo hash. Tampoco se garantiza que devuelva el mismo valor de hash en diferentes versiones de .NET framework, lo que significa que una actualización podría producir un hash diferente para la misma cadena, lo que hace que sus contraseñas sean inutilizables para usted.

Se recomienda que utilice un hachís salado o incluso MD5 en un impulso. Puede cambiarlo fácilmente a algo dentro de Security.Cryptography espacio de nombres.

Como han dicho otros, GetHashCode no está diseñado para lo que estás tratando de hacer. Realmente hay un excelente artículo sobre cómo manejar las contraseñas de los usuarios de forma segura .

Para resumir el artículo, debe usar un esquema de hashing adaptativo relativamente lento, como bcrypt , o alternativamente el Protocolo de contraseña remota segura de Stanford . Yo sugeriría lo primero. Y por supuesto también deberías usar una sal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top