2010-12-01 11 views
5

Tengo 2 dispositivos y deseo configurar un canal de comunicación seguro entre ellos. El único secreto compartido es una frase de contraseña (de 7 a 20 caracteres ASCII). Si utilizo PBKDF2 (de RFC 2898) con sal común, iteraciones y frase de contraseña para generar una clave AES256-CBC y IV en ambos lados, creo que puedo autenticar al usuario y proporcionar un canal encriptado, todo en un solo paso. ¿Es cierto o hay alguna razón por la que solo he visto a personas usar PBKDF2 para verificar contraseñas?¿Puedo usar PBKDF2 para generar una clave AES256 para encriptar y autenticar implícitamente?

Mi razonamiento es que ambas partes deben conocer la frase de contraseña para generar la misma clave y IV. Entonces, si el dispositivo B puede descifrar datos del dispositivo A, ambos han demostrado que tienen la misma frase de contraseña.

Respuesta

4

PBKDF2 es una forma excelente de generar una clave común a partir de un secreto compartido (aunque no debería generar el IV de esa manera, el IV debe ser aleatorio y enviarse junto con el texto cifrado).

Sin embargo, CBC no es un modo de cifrado de autentificación. Esto se debe a que un atacante puede tomar un mensaje cifrado y realizar modificaciones predecibles en él, sin necesidad de poder leer el mensaje o conocer la clave. Tales ataques han roto sistemas del mundo real en el pasado.

Puede utilizar un modo de cifrado de autentificación, como el Modo de contador de Galois (GCM) en lugar de CBC.

Una alternativa es Encrypt-Then-MAC. Utilice PBKDF2 con dos sales diferentes para generar dos claves diferentes: primero, los datos se cifran utilizando CBC con la primera clave, y luego se calcula un HMAC sobre el texto cifrado utilizando la segunda clave.

También necesitará usar single-use-nonces para evitar ataques de repetición.

1

PBKDF2 no "verifica contraseñas". Genera claves de contraseñas.

Para verificar una contraseña, normalmente tiene algo que se cifra con una clave. La clave se genera a partir de la contraseña original, a través de PBKDF2. Entonces el cryptotext se guarda.

Cuando desee comprobar si el texto ingresado por el usuario coincide con la contraseña, genere la clave a partir del candidato de contraseña que utiliza PBKDF2, luego intente descifrar el criptexto guardado. Si el descifrado funciona, entonces tienes una coincidencia.

Normalmente, sin embargo, no usaría la clave basada en contraseña como session key.

Por lo tanto, NO, normalmente no protegerá el canal seguro con la clave basada en contraseña.

2

En general, no podría autenticar un mensaje usando un cifrado, porque el mensaje podría ser cualquier cosa. Sin embargo, si el mensaje se ajusta a un formato específico, supongo que es razonable suponer que el texto cifrado debe haberse producido con la clave compartida — con mensajes más largos en formatos más complejos que brindan una mayor seguridad. Por ejemplo, el relleno en un cifrado de bloque puede servir como una autenticación débil.

Para mayor seguridad, calcule un MAC utilizando el secreto compartido y envíelo con el texto cifrado.

Mientras que PBKDF2 se puede usar para producir un IV, solo puede hacerlo para un solo mensaje. En la mayoría de los casos, es mejor seleccionar un IV aleatorio y enviarlo con el texto cifrado.

+0

Estaré encriptando un protocolo basado en texto, por lo que podré decir que el mensaje fue descifrado correctamente. ¡Gracias por los consejos! – indiv

-1

La respuesta de caf es buena.Me gustaría agregar que estás tratando de implementar crypto, e incluso para expertos entrenados que generalmente es un bad idea. Usar la biblioteca de más alto nivel que puedas es mucho más seguro.

+0

Debe agregarlo como un comentario a la respuesta de un caf –

Cuestiones relacionadas