it-swarm-es.com

Implementación de referencia del hash y la verificación de contraseñas de C #

¿Alguien tiene una implementación de referencia (idealmente certificada por terceros o aprobada por el gobierno ) forma de hash unidireccional de una contraseña para C # o Java?

Idealmente, me gustaría ver algo que incluye una técnica de "sal y pimienta" como se menciona aquí así como cualquier otra técnica de seguridad moderna para validar que podría ser aplicable.

El contenido que quiero proteger es información que el usuario puede recordar, como una contraseña o la respuesta a una pregunta de seguridad.

Si no tiene una muestra de código completa, sería útil una descripción general del algoritmo que elegiría y métodos de ejemplo de salazón y pimienta.

7
goodguys_activate

Dado su nuevo requisito "aprobado por el gobierno", supongo que una buena solución sería PBKDF2 de RFC 2898 . Está implementado para .NET en Rfc2898DeriveBytes Class (System.Security.Cryptography) . Es de suponer que desea sustituir SHA-256 por SHA-1 allí.

También me encontré con la contraseña hash bastante segura: fshp que es como PBKDF1 pero con SHA-256 por defecto. Admite un número variable de iteraciones, con un valor predeterminado de 4096. Utiliza sales de 64 bits. Tienen implementaciones allí para .NET, Python, Ruby, Perl, PHP5, Java y JavaScript.

Como se describe y analiza en . Net impl de bcrypt - Stack Overflow , parece que para .NET/CLR otra buena opción (aunque no aprobada por NIST) es BCrypt.net:

y para Java una buena opción es

Supongo que ninguno de los dos parece tener el concepto de "pimienta" o la complejidad espacial de scrypt.

5
nealmcb

Los basicos

El enfoque básico es Hash(secret | salt), que se almacena junto con la sal. Obviamente, es importante utilizar un algoritmo hash moderno como una de las variantes SHA2 (aunque actualmente SHA1 no está totalmente roto como MD5). Tenga en cuenta que si está almacenando preguntas de desafío de esta manera, probablemente desee Trim() y ToLower() el secreto antes de aplicar el hash. Esto puede reducir un poco la complejidad, pero las preguntas de seguridad no están diseñadas para tener una alta entropía como una contraseña de todos modos.

¿Qué pasa con los ataques de fuerza bruta como las tablas Rainbow?

Las preocupaciones sobre los ataques de fuerza bruta se pueden mitigar de dos maneras:

  1. Requiere una cantidad mínima de entropía en el secreto (longitud, complejidad, etc.).
  2. Aumente la cantidad de cálculos necesarios para realizar el hash.

El método utilizado en bcrypt es una buena mejora en el hash estándar porque aumenta la cantidad de tiempo para calcular el hash en muchos órdenes de magnitud. Básicamente, solo hash iterativamente el secreto muchas veces: Hash(Hash(...Hash(secret | salt)...))

Debido a que la cantidad de tiempo aún es relativamente pequeña (cientos de milisegundos), no agrega un retraso intolerable para el usuario legítimo. Pero puede arruinar los ataques automatizados de fuerza bruta.

Eso no es lo suficientemente bueno

Si la dificultad adicional de bcrypt es insuficiente, intente scrypt . Funciona como bcrypt pero necesita guardar cada hash iterativo en la memoria para una fusión final al final. Esto agrega la misma complejidad de tiempo que bcrypt pero también aumenta la complejidad del espacio, lo que hace que sea más difícil de implementar en hardware, especialmente en paralelo.

Implementación

Honestamente, no conozco una biblioteca de C # para implementar esto, y mucho menos una "certificada" por algún organismo oficial, pero no sería demasiado difícil. Suponiendo que escribe código seguro para subprocesos y la verificación de la contraseña se realiza en un sistema confiable como un servidor, las preocupaciones de implementación como ataques de canal lateral se minimizan.

Lectura adicional: Esta respuesta a ¿Es BCrypt un buen algoritmo de cifrado para usar en C #? ¿Dónde puedo encontrarlo?

2
Justin Morgan

. Respuesta neta :
Según esta publicación all - Cng y - CryptoServiceProvider implementaciones posfijadas del . Net Cryptography Namespace debe tener certificación FIPS, a diferencia de las versiones administradas.

Inconvenientes:

Ventajas:

  • Están certificados por FIPS
  • Los algoritmos hash usan bcrypt
1
Ioanna