Primero, algunos términos que son importantes:
Hashing : el acto de tomar una cadena y producir una secuencia de caracteres que no se puede revertir a la cadena original.
Cifrado simétrico : (generalmente conocido como 'cifrado'): el acto de tomar una cadena y producir una secuencia de caracteres que se pueden descifrar en la cadena original mediante el uso de la misma clave de cifrado que la cifró.
Tabla Rainbow : una tabla de búsqueda que contiene todas las variaciones de caracteres hash en un algoritmo de hash específico.
Sal : una cadena aleatoria conocida agregada a la cadena original antes de que se divida en hash.
Para .NET Framework, Bcrypt aún no tiene una implementación de referencia verificada . Esto es importante porque no hay forma de saber si hay fallas graves en una implementación existente. Puede obtener una implementación de BCrypt para .NET aquí . No sé lo suficiente sobre criptografía para decir si es una implementación buena o mala. La criptografía es un campo muy profundo. No intente construir su propio algoritmo de cifrado . Seriamente.
Si va a implementar su propia seguridad de contraseña (suspiro), debe hacer varias cosas:
- Use un algoritmo hash relativamente seguro .
- Sale cada contraseña antes de que se mezcle.
- Use una sal única y larga para cada contraseña y almacene la sal con la contraseña.
- Requerir contraseñas seguras .
Desafortunadamente, incluso si haces todo esto, un hacker determinado aún podría descubrir las contraseñas, solo le tomaría mucho tiempo. Ese es tu principal enemigo: el tiempo .
El algoritmo bcrypt funciona porque se necesitan cinco órdenes de magnitud más para descifrar una contraseña que MD5 ; (y todavía mucho más tiempo que AES o SHA-512). Obliga al pirata informático a dedicar mucho más tiempo a crear una tabla de arcoíris para buscar sus contraseñas, por lo que es mucho menos probable que sus contraseñas estén en peligro de ser pirateadas.
Si está usando sal y hash para sus contraseñas, y cada sal es diferente, entonces un pirata informático potencial tendría que crear una tabla de arco iris para cada variación de sal , solo para tener una tabla de arco iris para una contraseña salada + hash. Eso significa que si tiene 1 millón de usuarios, un hacker debe generar 1 millón de tablas de arcoíris. Si está utilizando la misma sal para cada usuario, entonces el hacker solo tiene que generar 1 tabla de arcoíris para hackear con éxito su sistema.
Si no está usando sus contraseñas, todo lo que un atacante debe hacer es abrir una tabla Rainbow existente para cada implementación (AES, SHA-512, MD5) y ver si una coincide con el hash. Esto ya se ha hecho , un atacante no necesita calcular estas tablas Rainbow .
Incluso con todo esto, debes estar usando buenas prácticas de seguridad . Si pueden usar con éxito otro vector de ataque (XSS, inyección de SQL, CSRF, et al. ) En su sitio, la buena seguridad de la contraseña no importa. Eso suena como una declaración controvertida, pero piénselo: si puedo obtener toda su información de usuario a través de un ataque de inyección SQL, o puedo hacer que sus usuarios me den sus cookies a través de XSS, entonces no importa qué tan buena sea su contraseña la seguridad es .
Otros recursos:
- Jeff Atwood: .NET Encryption Simplified (ideal para una descripción general del hashing)
- Jeff Atwood: acabo de iniciar sesión como tú
- Jeff Atwood: Probablemente esté almacenando contraseñas incorrectamente
- Jeff Atwood: Speed Hashing
Nota: Recomiende otros buenos recursos. Debo haber leído una docena de artículos de docenas de autores, pero pocos escriben sobre el tema tan claramente como lo hace Jeff. Edite los artículos a medida que los encuentre.