¿Cómo puedo convertir de forma segura una contraseña de "cadena" a una clave utilizada en AES?

20

Estoy escribiendo algún software donde tengo que cifrar todos los archivos que se escriben en una carpeta específica utilizando AES. Hay una contraseña / clave que se configura en algún lugar, que siempre se usa.

No quiero almacenar una cadena base64 porque es demasiado complicado para la persona que podría tener que cambiar la configuración. Quiero almacenar una cadena que contiene cualquier carácter. ¿Cuál es la mejor manera de convertir esta contraseña en una clave para usarla en AES?

  • ¿Puedo obtener los bytes de la clave?
  • L¿Debería generar una clave usando PBKDF2?

Según tengo entendido, también necesito proporcionar una sal. Sin embargo, en mi situación, la sal parece innecesaria porque solo tengo una clave.

  • ¿Simplemente proporciono una sal vacía o es que de alguna manera no es seguro?
  • ¿O hay una forma completamente diferente (esperemos que más simple)?
pregunta Matthijs Wessels 12.07.2013 - 13:30
fuente

3 respuestas

33

Lo que haces es lo siguiente:

  • Genere una clave larga (esto es solo una cantidad segura de datos generados aleatoriamente, puede usar 128 bits)
  • Usted usa esta clave para cifrar su archivo con AES (lo que significa que lo usa como contraseña)
  • Usted encripta la clave con AES usando su contraseña (que es un poco más corta pero más fácil de recordar. Ahora AES requiere que esta sea de 128, 192 o 256 bits de longitud, por lo que necesita hacer su contraseña de esa longitud Por lo tanto, solo puede usar PBKDF2 (o scrypt o bcrypt) para crear una longitud de clave fija desde su contraseña. NO ALMACEN ESTO .
  • Mantienes un hash de tu contraseña hash usando PBKDF2 (o bcrypt o scrypt). Esto le permitirá verificar si la contraseña es correcta antes de intentar descifrar su clave cifrada.

Entonces:

hash(hash(password)) --> can be stored
hash(password) --> cannot be stored

Siempre debe proporcionar una sal incluso si solo tiene una clave (esto evita en gran medida las búsquedas en la tabla del arco iris). Afortunadamente para usted, la generación de sal se realiza automáticamente por PBKDF2.

Así que al final tienes 3 cosas:

  • Sus archivos encriptados
  • Su clave encriptada
  • Un hash de tu contraseña para verificarla

Puede preguntar por qué necesita la clave: si cambiaría su contraseña (y cifró todos sus archivos con su contraseña), primero deberá descifrar todos sus archivos con su contraseña original y luego volver a cifrarlos. con tu nueva contraseña. Con esta implementación, todo lo que necesita hacer es descifrar y volver a cifrar la clave (ya que esta clave sirve como su contraseña).

EDIT

De alguna manera, malinterpreté su pregunta, agregué la función de derivación de claves.

También a buena lectura (cortesía de IBM)

    
respondido por el Lucas Kauffman 12.07.2013 - 13:51
fuente
9

Para convertir una contraseña en una clave AES, PBKDF2 es la forma más sencilla de manejarlo. Simplemente asegúrese de que la contraseña tenga suficiente entropy .

Usted hace necesita usar sal, porque está allí para protegerse contra los ataques de la mesa del arco iris.

Dependiendo de su plataforma, es posible que ya haya bibliotecas disponibles para ayudar con esto. Si no, recomendaría algo parecido a la solución de Lucus Kaufman.

Configuración:

  1. Genere una clave aleatoria de 128 bits (k1), una aleatoria IV y una aleatoria salt (64 bits probablemente sea suficiente).
  2. Use PBKDF2 para generar una clave de 256 bits a partir de su contraseña y la sal, luego divídala en dos teclas de bit (k2, k3).
    • Asegúrese de que la salida nativa de su algoritmo sea de al menos 256 bits, o esto será lento. PBKDF2- SHA256 es una buena opción. No use dos algoritmos separados para esto, ya que solo lo hará más lento y más complicado para usted, pero no ralentizará a un atacante.
    • Si su contraseña ya tiene una entropía suficientemente alta, entonces puede permitirse utilizar un número bastante bajo de iteraciones. 1000 iteraciones serán tan rápidas que ni siquiera lo notará (especialmente porque solo tendrá que descifrar la clave cuando se inicie el programa), así que no hay razón para ir por debajo de eso. Si su contraseña es más débil, puede aumentar el número de iteraciones para compensar.
    • No recomiendo usar bcrypt para esto, ya que su salida es del tamaño incorrecto y deberías hacer un hash De nuevo, lo que añade una complejidad innecesaria.
    • Creo que scrypt puede generar resultados de tamaño arbitrario, por lo que sería una buena opción si está disponible (esto puede no estar permitido si desea conformidad con FIPS ).
  3. Usa k2 para AES encripta k1 usando el IV aleatorio.
  4. Guarde la clave cifrada, k3, el salt y el IV en un archivo en alguna parte.

Cifrado / Descifrado:

  1. Use PBKDF2 + su contraseña y la sal del archivo para regenerar k2 y k3.
  2. Verificar k3. Si no coincide, su contraseña es incorrecta o alguien manipuló su archivo. Detente aquí.
  3. Usa k2 y el IV del archivo para descifrar k1.
  4. Use k1 para cifrar o descifrar archivos.

Cambio de contraseña

  1. Descifre k1 como en la sección Cifrado / Descifrado .
  2. Siga los pasos en Configuración , utilizando el mismo k1, pero regenere todo lo demás (nuevo salt aleatorio e IV, genere k2 y k3 a partir de la nueva contraseña).

No almacene k2 en ningún lugar. No almacene k1 sin cifrar. Hacer cualquiera de estas cosas romperá la seguridad de su sistema.

Si no te importa poder cambiar tu contraseña (consideraría que esta es una característica muy importante, pero tal vez no lo hagas), entonces podrías omitir los pasos relacionados con k1 y usar k2 como tu clave AES y k3 para verificarlo.

También puede resultar útil generar otra clave para HMAC , para que pueda verificar que los archivos cifrados no han sido manipulados Si desea hacerlo, puede generar una clave HMAC de 128 bits y cifrarla y almacenarla con la clave AES principal.

    
respondido por el Brendan Long 12.07.2013 - 19:49
fuente
6

Si generas una clave, deberías hacer un hash, considerando que una función de hash es "similar a" como un pseudo-rng. Por lo tanto, el uso de PBKDF2 siempre es bueno, ya que es un método de derivación clave y se usa específicamente para este propósito. Usted ingresa una contraseña, y genera una clave que puede usar según su contraseña y un salt. En cuanto a Salt, forma parte automá- tica de PBKDF2, por lo que no debe preocuparse por ello.

Si usa algo como .NET y almacena la clave en su archivo web.config, puede cifrar partes de su web.config con la clave de la máquina o una clave RSA enlace , lo bueno de esto es que Windows se encargará de almacenar la clave RSA y la clave de la máquina. Incluso puede automatizar este proceso con su servidor de compilación.

    
respondido por el nerdybeardo 12.07.2013 - 14:03
fuente

Lea otras preguntas en las etiquetas