Bob recibe el IV, el texto cifrado y el algoritmo, carga la clave idéntica en la memoria desde su copia, y luego hay una API que se ve muy similar, crea decipherIV y llama a update y final en el objeto decipher. Y esto devolverá el texto plano original que Alice quería compartir con Bob.
Así que hablamos sobre la clave. ¿Qué valor podemos usar como clave? Podríamos ser tentados a usar una contraseña memorable para humanos como la clave en sí misma, porque es fácil de recordar. Pero esto es un problema. Mencionamos antes que tenemos un gran espacio de opciones para almacenar la clave, ¿verdad? Con 256 bits. Si Eve, el atacante, puede asumir que Alice está utilizando una contraseña memorable para humanos como la clave, entonces Eve no tiene que probar todas las combinaciones dentro de ese espacio realmente grande de opciones. En su lugar, ella puede limitarse a un conjunto mucho más estrecho de contraseñas memorables para humanos.
Por eso no queremos usar una contraseña memorable para humanos como la clave. Entonces, ¿qué podemos usar si aún queremos confiar en algo que recordamos como base de nuestra seguridad y nuestra clave? Para esto, podemos usar lo que llamamos una función de derivación de clave, o KDF en resumen. Un KDF es similar a una función hash, con la que puedes estar familiarizado al verificar la integridad de los archivos. Es una función determinista unidireccional, y le das la contraseña memorable para humanos y la expande. La salida es algo que proporcionará una clave mucho más fuerte y más larga, que podemos usar para nuestra encriptación. A diferencia de una función hash normal, el KDF está diseñado para ser intencionalmente lento, lo cual no es algo que veas a menudo cuando diseñamos cosas para que sean lentas a propósito.
La razón por la que hacemos esto es porque el hecho de que esta función sea lenta no ralentizará a Alice, porque solo tiene que ejecutar esta función una vez para la contraseña que recuerda, pero ralentizará a Eve. Lo que Eve podría intentar hacer es descargar la lista, digamos, de las 10,000 contraseñas más comúnmente utilizadas de Internet, y luego, para derivar la clave de ellas en cada iteración en esa lista de 10,000 opciones, necesitará ejecutar esta costosa función KDF. Esto va a ralentizar a Eve, el atacante. Esto suena bien. Entendemos el valor del KDF. Pero si lo piensas, aún falta una parte porque lo que Eve puede hacer no es ir a Internet y simplemente descargar una lista de las 10,000 contraseñas más comúnmente utilizadas. Ella puede descargar una lista de valores precalculados cuando esas contraseñas comunes se pasan por algún KDF conocido que ella puede asumir que se utiliza en la encriptación. Y si este es el caso, si esto es posible, entonces el KDF no la está ralentizando en absoluto, y solo está complicando la vida de Alice y Bob.
Por eso, crucialmente, en un escenario del mundo real con un KDF, hay un segundo parámetro, no solo la contraseña, sino otro valor aleatorio, que llamamos valor de salt. Entonces, incluso si Eve tiene acceso a nuestro salt, para intentar estas contraseñas conocidas, ella tendrá que pagar el costo de ejecutar la función para cada iteración con el valor de salt. Y esto es lo que se asegura de que el KDF realmente la ralentice y evite que fuerce bruta nuestra contraseña. Veamos cómo se hace esto en Node.js. Podemos echar un vistazo al KDF s-script, que es un KDF conocido, secure crypt. Está disponible dentro del módulo Crypto. Y puedes ver que tomamos la contraseña, generamos bytes aleatorios como salt, pasamos eso a la función s-script, y obtenemos una clave que podemos usar. Otra mención notable aquí, tenemos otras dos KDF incorporadas en el módulo Crypto.
Comments