Pregunta

¿Cuál es un esquema de cifrado bueno y simple para proteger contraseñas en una base de datos?No necesito necesariamente nada que sea hiperseguro ni nada que sea ultrarrápido, pero esas cosas estarían bien.Principalmente, sólo quiero algo que sea fácil de implementar sin que sea terriblemente lento o inseguro.

¿Fue útil?

Solución

Como dice mk, SHA1 o MD5 son los estándar, junto con SHA2.


Actualizar:A medida que los procesadores se han vuelto más rápidos a lo largo de los años, los hashes se han vuelto más fuertes.Ahora se recomienda utilizar bcrypt.


Lo que desea se denomina más generalmente función hash criptográfica.Los hash criptográficos están diseñados para ser unidireccionales (dado el hash resultante, no debería poder derivar la entrada original).Además, la probabilidad de que dos cadenas arbitrarias tengan el mismo hash (conocido como colisión de hash) debe ser baja (idealmente 1/número de valores hash).

Desafortunadamente, el hecho de que sus contraseñas tengan hash no le libera de tener que esforzarse mucho para mantener seguras las versiones hash.Demasiadas personas utilizarán contraseñas débiles que serían vulnerables a un ataque de fuerza bruta fuera de línea.

Editar: varias personas también han señalado la importancia de usar sal.Una sal es un valor constante que se mezcla con la entrada antes de usar la función hash.Tener una sal única evita que los atacantes fuera de línea utilicen tablas precalculadas de contraseñas comunes (tablas arcoíris) para forzar sus contraseñas aún más rápido.

Otros consejos

MD5 o SHA1 + sal.

Si usa MD5 o SHA1, use sal para evitar cortes en la mesa del arco iris.

En C# esto es fácil:

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );

Fácil: BCripta.

jeff Probablemente estés almacenando contraseñas incorrectamente El artículo es una excelente lectura sobre este tema.

Ese fue un problema mío hace un par de semanas.Estábamos implementando un gran proyecto MIS en 975 ubicaciones geográficas diferentes donde nuestro propio almacén de credenciales de usuario se utilizará como autenticador para diferentes conjuntos de aplicaciones ya implementadas y en uso.Ya proporcionamos servicios de autenticación basados ​​en REST y SOAP, pero el cliente insistió en poder acceder al almacén de credenciales de usuario desde otras aplicaciones con solo una conexión de base de datos para una vista de solo lectura de la tabla o vista relacionada.Suspiro... (Esta mala decisión de diseño altamente acoplada es tema de otra pregunta).

Eso nos obligó a sentarnos y convertir nuestro esquema de almacenamiento de contraseñas saladas y con hash iterativo a una especificación y proporcionar algunas implementaciones de lenguaje diferentes para una fácil integración.

Lo llamamos Contraseñas hash bastante seguras o FSHP en breve.Lo implementé en Python, Ruby, PHP5 y lo lancé al dominio público.Disponible para consumir, bifurcar, flamear o escupir en GitHub en http://github.com/bdd/fshp

FSHP es una implementación de hash de contraseñas salada y con hash iterativo.

El principio de diseño es similar con PBKDF1 especificación en RFC 2898(también conocido como:PKCS #5:Especificación de criptografía basada en contraseña, versión 2.0.) FSHP permite elegir la longitud de la sal, el número de iteraciones y el función hash criptográfica subyacente entre SHA-1 y SHA-2 (256, 384, 512).El metaprefijo autodefinido al comienzo de cada salida lo hace portátil y al mismo tiempo permite al consumidor elegir su propia línea base de seguridad de almacenamiento de contraseñas.

SEGURIDAD:

El FSHP1 predeterminado utiliza sales de 8 bytes, con 4096 iteraciones de hash SHA-256.- La sal de 8 bytes hace que los ataques a la tabla arcoíris sean poco prácticos al multiplicar el espacio requerido con 2^64.- 4096 iteraciones hacen que los ataques de fuerza bruta sean bastante caros.- No se conocen ataques contra SHA-256 con los que encontrar colisiones un esfuerzo computacional de menos de 2^128 operaciones en el momento de esta versión.

IMPLEMENTACIONES:

  • Pitón:Probado con 2.3.5 (con hashlib), 2.5.1, 2.6.1
  • Rubí:Probado con 1.8.6
  • PHP5:Probado con 5.2.6

Todo el mundo es más que bienvenido a crear implementaciones de lenguaje faltantes o Pule los actuales.

OPERACIÓN BÁSICA (con pitón):

>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt')
>>> print fsh
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g==
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh)
True

PERSONALIZACIÓN DE LA CRIPTA:

Debilitemos nuestro esquema de hash de contraseñas.- Disminuya la longitud de la sal del valor predeterminado de 8 a 2.- Disminuir la ronda de iteración del valor predeterminado 4096 a 10.- Seleccione FSHP0 con SHA-1 como algoritmo hash subyacente.

>>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0)
>>> print fsh
{FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ==

Utilizar el sha Algoritmo de hash unidireccional junto con una sal única.Es el algoritmo principal que utilizo para almacenar mis contraseñas en la base de datos.

Si está utilizando SQL Server, existe la función HashBytes:

http://msdn.microsoft.com/en-us/library/ms174415.aspx

Apoyo con reservas la votación a favor de MD5 o SHA.Cualquiera de los principales lenguajes de desarrollo web tiene funciones integradas para calcular el hash (en PHP, por ejemplo, el paquete mcrypt contiene las funciones necesarias).

Debe utilizar un algoritmo hash unidireccional como SHA-1 sugerido anteriormente con sal.Sugeriría este sitio para obtener más información.Incluye algún código/implementación de muestra.http://www.obviex.com/samples/hash.aspx

Creo que la clave para una mayor seguridad es utilizar sales dinámicas.Esto significa que genera una cadena aleatoria para cada nuevo usuario y usa esa cadena para salar el hash.Por supuesto, necesitas almacenar este salt en la base de datos para poder verificar la contraseña más tarde (no la cifro de ninguna manera).

Para un cifrado no reversible, definitivamente elegiría SHA256 o SHA1.El MD5 tiene bastantes colisiones ahora y se ha puesto mucho esfuerzo en romperlo, por lo que no es bueno usarlo.

Si desea preparar su solución para el futuro, le recomendaría SHA256 o SHA512.El mundo criptográfico geek está nervioso por MD5 y, en menor medida, SHA1.

O si puedes, espera SHA-3

He notado mucha confusión sobre cómo realizar correctamente el hash de contraseñas, especialmente en stackoverflow.Así que escribí una página que debería aclararlo todo.Hay algo más que usar un simple hash.

Más información: Cómo hacer hash de contraseña correctamente

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