Este artículo: La vida en un mundo posterior a la base de datos: usar crypto para evitar las escrituras DB
Me pidió que escribiera este url-crypt módulo Node.js para convertir un Secreto en cadenas seguras de la base64 de urlsafe.
Piense en un enlace de verificación de correo electrónico que no necesite almacenar sus datos en la base de datos. O bien, un token JWT cuyas reclamaciones son secretas en lugar de base64.
La idea es cifrar y almacenar una cantidad razonable de datos (< 512 caracteres) en < 2k caracteres de base64 (una URL) para que pueda ser descifrado más tarde.
Publiqué esto en npm y luego pensé. ¿Es seguro? La inseguridad sería inútil para otros: - /
Cómo funciona:
var urlCrypt = require('url-crypt')('super-secret-key');
var data = { hello: 'world', this: 'is a test', of: 'url-crypt' };
var base64 = urlCrypt.cryptObj(data);
var backAgain = urlCrypt.decryptObj(base64);
expect(backAgain).to.eql(data);
Lo que hace: urlCrypt.cryptObj(obj)
:
- Convierte obj a JSON
- Gzips el JSON
- Crea 30 bytes de sal
- Encripta [salt] [gzip] con aes-256-cbc y un pbkdf2 de clave
- Convierte a base64
Y de vuelta.
El código es 2 funciones, todo un archivo.
Algunas preguntas específicas:
-
Aquí agrega algo de jitter como protección contra los ataques de diccionario. ¿Esto lo hace más fuerte?
-
Aquí usa pbkdf2 para hacer la clave aes. La sal es constante. ¿El pbkdf2 de esta manera lo hace más fuerte? Añadir un parámetro de configuración de sal parece simplemente hacer una clave más larga.
-
Aquí pone algunos datos aleatorios frente al datos reales Si supiera los datos reales ({email: "[email protected]"}) pensé que sería más fácil adivinar el secreto. Este dato aleatorio es para proteger contra eso. ¿Ayuda esta sal?
-
Aquí repite el aes-256- cbs. ¿Esto es útil? La repetición hace que el token de finalización sea más largo (lo que hace que haya menos datos en la URL), ¿es esto extraño?
-
¿Cuál es la mejor manera de hacer que la computación sea más difícil, sin alargar el token?
-
¿Hay alguna manera de mejorar esto? O cualquier complejidad que pueda eliminarse.
Gracias! Es mi primer módulo centrado en la seguridad, así que quería que se revisara la cordura.