Voy a reformular una pregunta que hice antes, ya que no creo que nadie haya entendido lo que quería decir.
Básicamente estoy escribiendo un bloqueador de contraseñas basado en web, que puede tener varias cuentas; para que los usuarios puedan compartir las contraseñas (útil si está en una compañía de sitios web y necesita compartir los datos de inicio de sesión para decir "1 & 1" o "Fasthosts", etc.).
He estado haciendo un montón de investigación sobre algoritmos de cifrado, CSPRNG, algoritmos de hash, estiramiento de claves, etc. ...
No quiero implementar mis propios algoritmos de cifrado o hashing (porque eso es un gran no-no!) en su lugar, quiero usar los algoritmos existentes y aplicarlos de una manera que he entendido de mi investigación.
No soy una criptógrafa, por lo que puedo haber entendido algo incorrectamente, o algo que he leído se ha encontrado que es inseguro o es una forma antigua de hacer las cosas y algo mejor ha llegado. Así que me gustaría discutir cuáles son los pensamientos acerca de la implementación:
Hashing para almacenar las contraseñas de las cuentas de usuario. y;
Cifrado para almacenar los detalles de inicio de sesión de los sitios web que los usuarios pueden compartir.
Hash
En primer lugar, necesito almacenar los hashes de las contraseñas de las cuentas (estas son las cuentas que inician sesión en la aplicación para ver las contraseñas compartidas).
Después de leer alrededor, entiendo que para hacer un hash "más seguro", necesitas usar scrypt o bcrypt o pbkdv2. He encontrado una implicación de estos 3 alrogithms en "CryptSharp" (con suerte esta es una implementación segura de estos algoritmos), también después de una investigación adicional ( enlace ) parece que sCrypt es una forma más segura de crear un hash.
¿Scrypt es una forma segura de crear un hash de la contraseña de un usuario o debo usar uno de los otros dos (es decir, tal vez no se haya probado un código de prueba tanto como los otros dos)? ¿Cómo puedo saber si la implementación de sCrypt en "CryptSharp" es una buena implementación segura?
Encriptación
Como los datos se compartirán entre los usuarios, tendré que asegurarme de que el sistema use una clave de cifrado maestra para todo el proyecto y que esta se almacene de forma segura.
Mi pensamiento aquí es generar una clave de cifrado y un vector de inicialización (3 de ellos, explicaré por qué): estos se generarán con RNGCryptoServiceProvider, y los 3 se concatenarán en Key1 | IV1 | Key2 | IV2 | Key3 | IV3 para que puedan dividirse y usarse con los algoritmos de cifrado.
Necesito alguna forma de almacenar esta cadena concatenada de IV y claves, por lo que después de algunas investigaciones encontré la API de protección de datos de Microsoft (ProtectedMemory.Protect (secret, MemoryProtectionScope.SameLogon)). Mi entendimiento con esto es que la aplicación El grupo deberá ejecutarse bajo una cuenta de usuario y el "perfil de carga" establecido en verdadero. La cadena cifrada resultante se almacenará en un archivo de configuración XML.
Con respecto al cifrado de las contraseñas que se compartirán, leí sobre el "cifrado en cascada" (utilizado en TrueCrypt). Los algoritmos de cifrado que utiliza TrueCrypt son; AES, TwoFish, y Serpent. He encontrado una implementación de estos ( enlace - que, una vez más, espero que sea una implementación segura). Aquí es donde se utilizarán los 3 IV y las claves; de manera efectiva, los datos se cifrarán así: Serpiente (TwoFish (AES (datos, clave1), clave2), clave3).
Tan solo para ser claro en esto; este es el proceso de encriptación dentro del sistema:
- Tras la instalación del sistema, el sistema utilizará RNGCryptoServiceProvider para crear 3 claves de cifrado y 3 IV.
- Estas 3 claves e IV se concatinarán en una sola cadena: Key1 | IV1 | Key2 | IV2 | Key3 | IV3 (para que pueda dividirlas y usarlas en los 3 algoritmos de encriptación).
-
Esta cadena se cifrará mediante la API de protección de datos y se almacenará en un archivo de configuración.
-
Todos los detalles de inicio de sesión compartidos se cifran mediante el "cifrado en cascada" de: Serpiente (TwoFish (AES (datos, clave1), clave2), clave3): las 3 claves y los IV se descifrarán al vuelo, en lugar de estar almacenados en la memoria.
Cuando sea el momento de descifrar los datos de inicio de sesión compartidos:
- Las 3 claves y se descifran usando DPAPI
- El cifrado se invierte: AES (TwoFish (Serpent (data, key3), key2), key1);
¿Es el "cifrado en cascada" una buena idea? ¿La API de protección de datos es una buena forma de cifrar las claves y los IV?
Como digo, sé cómo construir todo el sistema y mejorar mi comprensión del hashing y el cifrado en el sistema ... pero, ¿es lo que he comentado la forma correcta de hacer las cosas? ¿Estoy mirando algo? ¿Malentendí algo? ¿Estoy usando un viejo sombrero para hacer las cosas?
Apreciaría cualquier consejo. Muchas gracias.