Estoy escribiendo un proyecto para almacenar y compartir contraseñas de forma segura entre usuarios, he estado investigando sobre algoritmos de cifrado, CSPRNG, algoritmos de hash, estiramiento de claves, etc. ...
Solo quiero diseñar mi pensamiento sobre cómo usar todos estos, para crear la aplicación segura, y espero que alguien (s) pueda señalar nuestras fallas o dirigirme si estoy viendo las cosas mal:
Hash
Primero que nada, 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 implementación de estos en "CryptSharp" (espero que esta sea una implementación segura), también después de una investigación adicional ( enlace ) parece que scrypt es una forma más segura de crear un hash.
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, así que después de algunas investigaciones encontré la API de protección de datos de Microsoft (ProtectedMemory.Protect (secreto, MemoryProtectionScope.SameLogon)). Mi entendimiento con esto es que el grupo de aplicaciones 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).
¿Por qué?
Por lo tanto, estas son mis ideas para crear un sistema de almacenamiento de datos seguro; ¿Estoy mirando algo? ¿He entendido mal algo? ¿Debería estar haciendo algo más?
Agradezco cualquier consejo sobre esto.