Consejos sobre el uso de cifrado y hash

0

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:

  1. Tras la instalación del sistema, el sistema utilizará RNGCryptoServiceProvider para crear 3 claves de cifrado y 3 IV.
  2. 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).
  3. Esta cadena se cifrará mediante la API de protección de datos y se almacenará en un archivo de configuración.

  4. 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:

  1. Las 3 claves y se descifran usando DPAPI
  2. 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.

    
pregunta binks 04.07.2014 - 13:57
fuente

1 respuesta

-1

Esta publicación puede ser negativa, pero me parece interesante tu verdadera pregunta. Que considero que es:

  

¿Cómo compartir la contraseña entre el usuario de su servicio en Internet?

Empecemos con algunas suposiciones

Arquitectura de su servicio

  • Cada usuario tiene una cuenta protegida por una contraseña maestra conocida solo por ellos mismos
  • Cada usuario tiene una serie de contraseñas encriptadas asociadas a su cuenta
  • La contraseña maestra debe estar oculta antes de almacenarla en la base de datos.

Ahora debemos poder compartir de forma segura estas contraseñas encriptadas.

Hay un sitio web que hace algo similar: LastPass .

Una cosa a tener en cuenta sobre LastPass es que todo su cifrado se realiza en la lado del cliente. LastPass usa su contraseña maestra, la contraseña que usa para iniciar sesión en su cuenta, para cifrar todas sus otras contraseñas en el lado del cliente, su propia máquina.

Esto tiene la ventaja de que su contraseña maestra nunca saldrá de su propia máquina y, por lo tanto, a menos que su computadora esté comprometida Por un virus, es imposible que nadie más que usted descifre sus otras contraseñas. Ni siquiera los administradores de LastPass. Entonces tus contraseñas están en la nube pero es como si estuvieran en tu propia cabeza.

LastPass también puede compartir contraseñas entre usuarios. No sé cómo lo hacen pero haré una estimación aleatoria ...

Uso de clave pública / privada

El cifrado asimétrico es la clave aquí. Puede agregar fácilmente una clave pública y una clave privada a la cuenta. La clave pública debe estar en texto plano para que otros puedan usarla. Pero, la clave privada debe estar cifrada con su contraseña maestra en el lado del cliente, como todas las demás contraseñas, antes de ser almacenada en el servidor.

Ahora, si alguien quiere compartir una contraseña con usted, solo necesita solicitar su clave pública usando su nombre de cuenta (u otro alias), luego encripta una de sus contraseñas con su clave pública y la envía al sitio web que la agregará a su cuenta.

Cuando inicie sesión, verá que ha recibido una nueva contraseña. Luego puede descifrarlo en el lado del cliente usando su clave privada, Vuélvalo a cifrar con su clave maestra y guárdelo en el servidor.

    
respondido por el Gudradain 04.07.2014 - 15:34
fuente

Lea otras preguntas en las etiquetas