La criptografía es el proceso o técnica de convertir texto sin formato en texto cifrado para proteger la información de los piratas informáticos durante la transmisión de una computadora a otra. El módulo de criptografía de Python permite la conversión de texto sin formato o mensaje (en bytes) en texto cifrado utilizando el módulo fernet. El módulo fernet consta de métodos incorporados encrypt(), decrypt() y generate_key() para cifrar, descifrar y generar claves para el cifrado. El mensaje de texto encriptado con fernet no puede ser manipulado ni leído sin la clave. La clase MultiFernet implementa la rotación de claves para Fernet. El MultiFernet tiene un método incorporado giratorio() que se puede usar para retirar una clave anterior que ha sido expuesta.
Métodos utilizados:
generar_clave(): este método genera una nueva clave fernet. La clave debe mantenerse segura ya que es el componente más importante para descifrar el texto cifrado. Si se pierde la clave, el usuario ya no podrá descifrar el mensaje. Además, si un intruso o un pirata informático obtiene acceso a la clave, no solo puede leer los datos, sino también falsificarlos.
encrypt(data): Cifra los datos pasados como parámetro al método. El resultado de este cifrado se conoce como «token de Fernet», que es básicamente el texto cifrado. El token cifrado también contiene la marca de tiempo actual cuando se generó en texto sin formato. El método de cifrado lanza una excepción si los datos no están en bytes.
Sintaxis: cifrar (datos)
Parámetro:
- datos (bytes): el texto sin formato que se va a cifrar.
Devuelve: un texto cifrado que no se puede leer ni modificar sin la clave. Está codificado en base64 seguro para URL y se conoce como token Fernet.
decrypt(token, ttl = None): este método descifra el token de Fernet pasado como parámetro al método. En el descifrado exitoso, se obtiene como resultado el texto sin formato original; de lo contrario, se lanza una excepción.
Sintaxis: descifrar (token, ttl = Ninguno)
Parámetros:
- token (bytes): el token de Fernet (texto cifrado) se pasa para el descifrado.
- ttl (int): opcionalmente, se puede proporcionar un número entero como segundo parámetro en el método de descifrado. El ttl indica el tiempo de validez de un token. Si el token tiene más de ttl segundos (desde el momento en que se creó originalmente), se genera una excepción. Si no se pasa ttl como parámetro, no se tiene en cuenta la antigüedad del token. Si el token no es válido de alguna manera, se lanza una excepción.
Devoluciones: Devuelve el texto sin formato original.
rotar (token): este método rota un token volviendo a cifrarlo con la clave principal de la instancia de MultiFernet. Sin embargo, el nuevo cifrado conserva la marca de tiempo guardada originalmente con el token.
Sintaxis: rotar (token)
Parámetro:
- token (bytes): el token que se rotará para volver a cifrarlo
Devoluciones: si el token se ha rotado correctamente, se devuelve el token rotado. Si la rotación falla, lanza una excepción.
Instale el paquete de criptografía:
pip install cryptography
First Approach
MultiFernet realiza el cifrado utilizando la primera clave de la lista proporcionada. MultiFernet descifra tokens con cada clave por turno. Si no se encuentra la clave correcta en la lista proporcionada, se lanza una excepción cryptography.fernet.InvalidToken. En el fragmento de código a continuación, las claves se generan y se agregan a la lista. El MultiFernet toma la primera clave y la almacena en la variable f. Esta clave se utiliza para cifrar el texto sin formato en texto cifrado. Por otro lado, durante el descifrado, MultiFernet prueba todas las claves de la lista para descifrar el texto cifrado.
Python3
# import Fernet and MultiFernet modules from cryptography.fernet import Fernet, MultiFernet # key generation key1 = Fernet(Fernet.generate_key()) key2 = Fernet(Fernet.generate_key()) # the MultiFernet takes a list of Fernet instances f = MultiFernet([key1, key2]) # encryption and token generation token = f.encrypt(b"Welcome to GeeksForGeeks Python Module!") # display the ciphertext print(token) # decryption of ciphertext to plaintext d = f.decrypt(token) #display the plaintext #decode() method converts byte to string print(d.decode())
Salida :
b’gAAAAABfYfRrB3f0RQl108YFuGyFHZ2lIQBKpFkuEqJ0EgLi6TNPR9vhElTmyuo5EfBivBwEBfSkOQJPEtIqOBBKZH8iElFn3ON5eg5d_JA1G9oARG7RKiqiQiOP8R22U4pIxnO1banH’
¡Bienvenido al módulo Python de GeeksForGeeks!
Segundo enfoque
El segundo enfoque demuestra la rotación de claves. La rotación de llaves facilita el reemplazo de llaves viejas o expuestas. La nueva clave se puede agregar al frente de la lista de claves ya existente para comenzar a cifrar los mensajes nuevos, y las claves antiguas se eliminan porque ya no son necesarias. La rotación de tokens que ofrece MultiFernet.rotate() limita el daño en caso de un evento no detectado y aumenta la dificultad o frecuencia de los ataques. Por ejemplo, si un empleado que tiene acceso a las claves de fernet de la empresa se va, la empresa querrá generar una nueva clave de fernet, rotar todos los tokens implementados actualmente con la nueva clave y eliminar las claves de fernet anteriores a las que el empleado tenía acceso. . Esto se puede lograr fácilmente con MultiFernet.
Python3
# import Fernet and MultiFernet modules from cryptography.fernet import Fernet, MultiFernet # key generation key1 = Fernet(Fernet.generate_key()) key2 = Fernet(Fernet.generate_key()) # the MultiFernet takes a list of Fernet instances f = MultiFernet([key1, key2]) # encryption and token generation token = f.encrypt(b"Welcome to GeeksForGeeks Python Module!") # display the ciphertext print(token) # decryption of ciphertext to plaintext d = f.decrypt(token) #display the plaintext print(d.decode()) print('Key rotation') key3 = Fernet(Fernet.generate_key()) f2 = MultiFernet([key3, key1, key2]) rotated = f2.rotate(token) d2 = f2.decrypt(rotated) print(d2.decode())
Salida :
b’gAAAAABfYfUe1Zh3JAa33k_RBRgkXgh-40jS6iqjXEq5Tc6jCeds-QY_nmlhzjkVBdZzeoExKj-YJsefBkgVSjUH1CVNG4080cwa3ZBHA9Aftx5upXzNQnaZ5fgeJacPNY0jcm4PMZSs’
¡Bienvenido al módulo Python de GeeksForGeeks!
Rotación de claves
¡Bienvenido al módulo Python de GeeksForGeeks!
Publicación traducida automáticamente
Artículo escrito por Shreyasi_Chakraborty y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA