hashing de contraseña de nivel empresarial

2

Necesito crear algunas clases de hashing (C #) para un servicio de inicio de sesión donde (desafortunadamente) las contraseñas deben almacenarse en la base de datos del servidor SQL. En el pasado he estado usando BCrypt o PBKDF2, pero hay algunas preocupaciones. Esto es para una solución de nivel empresarial que se ejecuta en los Estados Unidos. Veo 3 rutas válidas que me gustaría que comentaras.

BCrypt: no es un estándar de NIST y probablemente sea necesario para algunos clientes. También soy reacio a usar BCrypt para el software de nivel empresarial porque necesito algo que esté respaldado por una gran empresa o algunos desarrolladores dedicados. Todo lo que puedo encontrar son algunas implementaciones (antiguas) que son mantenidas por un individuo en su tiempo libre. ¿No debería eso causar algunas preocupaciones? Me refiero a que mientras que algo es grande, la implementación podría no serlo. Y seguramente hay que mantenerlo.

¿Cuáles son las recomendaciones de iteración (factor de trabajo) de 2016 - 12?

PBKDF2: La única solución que puedo encontrar para C # es Microsofts "PasswordHasher" (o una implementación similar de Rfc2898DeriveBytes). La versión lanzada está usando HMAC SHA1 con 1000 iteraciones. Esto parece inválido en el 2016. Hay una versión más reciente

SHA1 + AES: Un enfoque alternativo sería simplemente ir con Rfc2898DeriveBytes estándar usando HMAC SHA1 y luego usar AES para cifrar los valores de la base de datos: almacenar la clave AES en el disco. Me gusta este enfoque, el mejor en realidad, pero si buscas estas cosas, esa solución nunca surge, por lo que podría faltar algo ...

¿Qué recomiendan ustedes? ¿Qué hace cuando se trata de proteger software de nivel empresarial?

    
pregunta Werner 05.09.2016 - 11:05
fuente

2 respuestas

3

¿Cuáles son sus requisitos reales? "Nivel empresarial" no dice mucho, al menos no más que será un gran proyecto . Si NIST es un requisito, entonces PBKDF2 es todo lo que tienes. Desde una perspectiva de seguridad, recomendaría bcrypt, ya que es ligeramente más seguro que PBKDF2, que se basa en las variantes de SHA. bcrypt en sí mismo se ha cocinado el tiempo suficiente como para ser una alternativa buena a PBKDF2, aunque el NIST no dice nada al respecto (aún).

Cuando se trata de la implementación, deberías usar una biblioteca bien establecida. No desea verificar manualmente los detalles de la implementación y usted tampoco debería hacerlo. Una búsqueda rápida reveló que hay varias implementaciones de bcrypt para C # que están bien soportadas en la comunidad de C #.

Para obtener más detalles sobre PBKDF2 vs bcrypt también vea la respuesta de Thomas Pornin.

Actualizar

No optaría por la opción SHA1 + AES. Hacer esto no resolverá realmente el problema, sino que solo mitigará los riesgos para ciertos tipos de ataques. Aun así, si la aplicación de alguna manera filtrara el contenido de la base de datos, solo puede confiar en SHA1. Me parece un truco , y lo último que quieres es cocinar algo tú mismo.

    
respondido por el Yorick de Wid 05.09.2016 - 11:27
fuente
2

No veo ninguna razón para no usar BCrypt, hay una biblioteca decente llamada BCrypt.Net .

La seguridad proviene del algoritmo, no de la implementación, por lo que puede verificar el resultado directamente con otras bibliotecas conocidas. Lo que puede salir mal es la generación de una sal aleatoria segura. Sin embargo, si observa el código fuente, puede ver que utilizan el generador de números aleatorios criptográficos de la biblioteca DotNet, por lo que esto se hace correctamente.

    
respondido por el martinstoeckli 05.09.2016 - 13:49
fuente

Lea otras preguntas en las etiquetas