Cómo cifrar todas las contraseñas de clientes existentes [cerrado]

7

Trabajo para una tienda en línea y desde que trabajé aquí hemos almacenado las contraseñas de los clientes en texto sin formato. Me uní a la empresa como informador de datos y cuando descubrí que lo habíamos hecho, lo encontré con la gerencia, pero no parecían interesados o preocupados. Varios años después, estoy a cargo del sitio web y ahora quiero cifrar todas las contraseñas de nuestros clientes.

¿Cuál es la forma más rápida y sencilla de cifrar todas las contraseñas de los clientes en un sitio web de comercio electrónico .NET? ¿Existen bibliotecas .NET que podamos utilizar?

Editar

Actualmente no sé casi nada sobre el cifrado o la seguridad de la contraseña. Me han acusado de no hacer ninguna investigación antes de publicar esta pregunta. De hecho, hoy comencé a investigar este tema y esta pregunta forma parte de mi investigación. Lo siento si la gente está ofendida por mi falta de conocimiento, pero no es por pereza. Simplemente no sé nada sobre este campo y ahora estoy tratando de averiguarlo. Esta pregunta es parte de eso. Realmente agradecería cualquier ayuda que me puedas dar.

    
pregunta Mike 16.01.2015 - 13:45
fuente

3 respuestas

5

Las contraseñas deben ser saladas y con hash, no encriptadas. Debe usar un hash lento para mitigar los ataques de precomputación. Aquí hay un código .NET: enlace

Editado para agregar: si su número de cuentas es bajo, es posible que simplemente pueda bloquear los intentos de inicio de sesión mientras se ejecuta el código hash. Sin embargo, está diseñado para ser lento, por lo que es posible que tenga que permitir los inicios de sesión mientras las contraseñas están encriptadas. Eso no es un problema. Compare primero la contraseña de texto simple; Si no hay coincidencia, haga un hash de la contraseña ofrecida y compare nuevamente.

No olvides que debes almacenar la sal y el hachís. Si no está cambiando el esquema de su base de datos, se pueden concatenar y almacenar en el campo de contraseña existente, asumiendo que es varchar. De lo contrario, es posible que tenga que agregar columnas a la base de datos y borrar la columna de texto sin formato una vez que se haya completado y confirmado el cálculo de hash.

Comprueba tu mecanismo de recuperación de contraseña. Cuando haya hecho esto, no podrá decirles a los usuarios cuáles son sus contraseñas. Necesitarás algún otro mecanismo de recuperación.

No es relevante para la pregunta, pero si no está utilizando TLS para el inicio de sesión, debe hacerlo.

    
respondido por el Bob Brown 16.01.2015 - 14:18
fuente
3

La mejor opción para el hashing de contraseñas provisto fuera de la caja por .Net es PBKDF2, que como comentó CodesInChaos se implementa como System.Security.Cryptography.Rfc2898DeriveBytes .

La elección real que debe hacer es si esta es la única modificación de sus necesidades de código de administración de cuenta / contraseña. Si es así, puede implementarlo directamente, reemplazando su administración de contraseñas actuales y terminar con esto.

Sin embargo, si existen otros problemas relacionados con la forma en que administra las credenciales (y con el almacenamiento de contraseñas de texto sin formato, sospecho que es probable), puede ser una mejor idea abstraer la administración de la cuenta por completo y redimensionar el factor. aplicación para utilizar ASP.NET Identity en su lugar. Esto le proporcionará el hashing de contraseñas basado en PBKDF2 de manera predeterminada, y también le brindará soluciones ya hechas para el restablecimiento de contraseñas, mecanismos de bloqueo de cuenta para evitar el uso de la contraseña y muchos otros beneficios de seguridad.

    
respondido por el Xander 16.01.2015 - 15:15
fuente
0

Es una mejor práctica codificar una contraseña en lugar de cifrarla. Básicamente, el hashing es un mecanismo de una sola vía, mientras que el cifrado es reversible.

¿Por qué es esto importante? Bueno, si una entidad malintencionada (que podría ser un empleado) encuentra cómo ha cifrado los datos (ya sea por fuerza bruta o simplemente robando la clave, etc.) pueden descifrarlos y luego (mal) usar las contraseñas de sus clientes, la mayoría de los cuales se habrá reutilizado en otros lugares (otros sitios, correo electrónico, banca, etc.). Una violación como esa dañaría la reputación de su sitio / empresa.

Con un hash, puedes saber cómo se ha generado un valor hash, pero no sabrás el valor (su contraseña) que lo ha generado. Por supuesto, a menos que no esté asegurando la comunicación entre el servidor al iniciar sesión (HTTP en lugar de páginas web HTTPS, por ejemplo). *

Como parte de este proceso, la contraseña también debe incluirse:

  

En la criptografía, una sal son datos aleatorios que se utilizan como un adicional   ingreso a una función unidireccional que contiene una contraseña o frase de contraseña. [1]   La función principal de las sales es defenderse contra los ataques de diccionario.   frente a una lista de hashes de contraseña

Fuente: enlace

Nuevamente, muy básicamente, esto sería donde un atacante toma una lista de palabras conocidas / comunes (pasa), di "letmein" y la pulsa. Sepa que sabrán el Hash que corresponde a la contraseña "letmein" y pueden buscar rápidamente para ver si alguno de sus usuarios tiene el mismo hash de contraseña. Obviamente, esto es muy fácil de automatizar con un "diccionario" de palabras posibles / comunes (de paso). La salazón ayuda a prevenir este escenario.

En cuanto a cómo implementarlo en .NET, vea esta pregunta (y respuestas) de Stack Overflow:

enlace

No estoy muy familiarizado con el desarrollo de .NET, pero de acuerdo con la respuesta de @ jd4u, la implementación predeterminada usa un salt además de la contraseña del usuario cuando se produce un Hash.

* Si las páginas de su sitio (al menos el inicio de sesión) aún no se han publicado a través de una conexión segura, haga esto también.

    
respondido por el Michael 16.01.2015 - 16:45
fuente

Lea otras preguntas en las etiquetas