¿Cómo habilitar la encriptación avanzada en líneas de comando?
Emprender el camino hacia la encriptación avanzada dentro de la línea de comandos podría parecer un reto abrumador al principio. Sin embargo, al implementar el estándar de encripción avanzada (AES), no solo incrementamos la seguridad de nuestros datos, sino que también ampliamos considerablemente nuestra competencia técnica. A continuación, exploramos las funcionalidades esenciales y avanzadas para cifrar y descifrar archivos de manera eficiente.
¿Cuáles son las funcionalidades principales necesarias?
Inicialmente, debemos incorporar dos funcionalidades clave:
Cifrar un archivo: Esta funcionalidad permite transformar un archivo de texto legible por humanos en un archivo seguro mediante el uso de AES.
Descifrar un archivo: El propósito aquí es revertir el archivo cifrado a su formato original comprensible.
Creación del comando de cifrado
Para habilitar este mecanismo, comenzamos creando un nuevo comando en nuestro proyecto. Este comando utilizará la palabra clave C para referirse a la acción de encriptar. Requiere los siguientes parámetros:
Una contraseña o llave.
Un "salt" (valor aleatorio) para mejorar la seguridad.
Tamaño del algoritmo AES (128, 192, o 256 bits).
Un "input" y un "output", definidos como ubicaciones.
importación de criptografía desde la librería estándar 'crypto'.funcióncifrado(contraseña, sal, tamaño, entrada, salida){// Proceso de encriptación utilizando AES}
¿Cómo logramos que nuestras contraseñas sean seguras?
Uno de los riesgos más significativos al cifrar datos es el uso de contraseñas fácilmente adivinables. Por ello, recomendamos generar llaves criptográficamente seguras a partir de contraseñas comunes.
Importancia del "Salt"
El "salt" juega un papel crucial, ya que permite variar el cifrado incluso si se utiliza la misma contraseña para múltiples archivos. Es un valor único que se utiliza en el proceso de encriptación y tiene el siguiente propósito:
Impedir ataques de diccionario: Aumenta el número de combinaciones posibles que un atacante debe probar.
Evitar la reutilización de llaves: Cada proceso de cifrado tendrá una resultante diferente.
Es recomendable combinar "salt" con el tamaño de la llave en bits; generalmente calculado dividiendo el tamaño en bits entre ocho.
¿Cómo se configura el proceso de descifrado?
Un aspecto esencial es que el mecanismo de descifrado debe reflejar el proceso de cifrado, considerando el mismo algoritmo y tamaño de llave.
Implementación de desefrado
A través de un comando simétrico, denominamos al proceso de descifrado con la palabra clave Deci. Este comando debe incluir parámetros similares al de cifrar:
Contraseña y "salt".
Tamaño de la llave.
Inputs y outputs.
función descifrado(contraseña, sal, tamaño, entrada, salida){// Proceso de descifrado utilizando AES}
Al implementar estas funcionalidades, nos aseguramos de que nuestros datos se manipulan de manera segura.
¿Qué debes hacer a continuación?
Ahora que has aprendido a aplicar el estándar AES en tu línea de comandos, te invitamos a avanzar más allá:
Generación de contraseñas fuertes: Intenta crear una función que utilice el algoritmo de hashing para lograrlo.
Exploración de algoritmos avanzados: Considera otros modos de operación de AES para adaptarse mejor a tus necesidades de seguridad.
Con cada paso que tomes, mejoras tu comprensión y capacidad técnica, allanando el camino hacia un dominio más profundo de la criptografía moderna. ¡Continúa explorando y dominando estos conceptos avanzados dentro de tu entorno de desarrollo!
Para los interesados en saber cómo se puede hacer esto en Python, hice un proyecto equivalente en python con comentarios y README.md para entenderlo bien:
Excelente trabajo Felicitaciones
Hice un fork al repositorio y le agregué algunos comentarios para entenderlo un poco mejor se los comparto ✨
Quizá puedan agregar un botón "favoritos" en cada curso, para repasarlo y tenerlos como cursos importantes para mi.
el tamaño del array de 16 es porque se divide el size entre 8?
Esto se debe a que el array de inicialización debe tener el mismo tamaño que el bloque. AES utiliza un tamaño de bloque de 128 bits (16 bytes), por lo que el tamaño del array debe ser de 16. El array que se crea es de tipo Uint8, que equivale a un byte.
no entiendo mucho javascript, hay mucha diferencia hacer esto en python?
Creo que se puede hacer todo lo que hacemos en este curso con PyCrypto. Va a tocar interpretar algunas cosas pero se puede 💪
Graciass.
¿Qué pasa si pierdo el vector inicial?
Si pierdes el Vector de Inicialización (IV), el archivo cifrado quedará permanentemente inaccesible, incluso si tienes la contraseña correcta. Piensa en el IV como el punto de partida exacto en un mapa del tesoro; sin él, la brújula (tu contraseña) no sabe desde dónde empezar a contar los pasos.
En algoritmos como AES en modo CBC, el IV garantiza que el primer bloque de datos se mezcle de forma impredecible. A diferencia de la contraseña, el IV no necesita ser secreto. La práctica estándar en la industria es generar un IV aleatorio de 16 bytes usando crypto.randomBytes(16) y adjuntarlo en texto plano al principio del archivo cifrado. Al descifrar, tu programa simplemente lee esos primeros 16 bytes para configurar el motor de descifrado y luego procesa el resto del archivo.
¿Cuál es la mejor forma de derivar llaves?
La mejor forma de manejar contraseñas humanas es pasarlas por una Función Derivadora de Llaves (KDF) como scrypt o PBKDF2. Los humanos somos pésimos creando llaves criptográficas; solemos usar palabras cortas y predecibles. Un algoritmo como AES requiere una llave perfecta de exactamente 16, 24 o 32 bytes de entropía pura.
Aquí es donde entra scryptSync. Esta función actúa como un "gimnasio computacional". Toma tu contraseña débil y la somete a miles de iteraciones matemáticas intensivas en memoria y CPU. Esto hace que sea computacionalmente carísimo para un hacker intentar adivinar contraseñas por fuerza bruta, ya que cada intento le tomará fracciones de segundo en lugar de microsegundos. El resultado final es un buffer de bytes del tamaño exacto que AES necesita, garantizando máxima seguridad.
¿Por qué es mejor usar un salt?
Imagina que el salt es como el condimento secreto en una receta. Si usas la misma contraseña para cifrar tus fotos y tus documentos financieros, un atacante podría notar patrones idénticos en los archivos resultantes. Al agregar un salt (un valor aleatorio único por archivo), transformas esa contraseña básica en una llave criptográfica completamente distinta para cada documento.
En la práctica, esto significa que incluso si dos archivos tienen exactamente el mismo contenido y usas la misma contraseña maestra, el resultado cifrado será radicalmente diferente. Esto mitiga los ataques de diccionario y las tablas rainbow. Siempre debes guardar el salt junto con el archivo cifrado (no es un secreto, es un modificador público) para poder reconstruir la llave exacta al momento de descifrar.