2017-08-08 3 views
1

Dans une application Python 3, je dois chiffrer les données de l'utilisateur à l'aide de son propre mot de passe. J'utilise la bibliothèque Cryptodome. Etant donné que AES a besoin d'une clé de taille fixe (128 bits dans l'exemple), j'ai utilisé PBKDF2 pour obtenir la clé. Voici la classe que j'utilise dans mon code.Classe d'exemple de chiffrement AES pour chiffrer des données à l'aide du mot de passe de l'utilisateur

I stocker le sel (sel dans le code) utilisé pour la dérivation de clé et le vecteur d'initialisation (IV dans le code) dans la partie supérieure du message lui-même. En effet, pour ce que j'ai compris (lire les docs here) ni le sel ni le iv ne doivent être gardés secrets.

Est-ce une approche correcte ou pouvez-vous me suggérer une meilleure approche?

from Crypto.Cipher import AES 
from Crypto.Random import get_random_bytes 
from Crypto.Protocol import KDF 

class crypto: 
    def __init__(self,pwd): 
     self.pwd = pwd 

    def encrypt(self,data): 
     salt = get_random_bytes(8) 
     key = KDF.PBKDF2(self.pwd,salt) #128bit key derivation function 
     iv = get_random_bytes(16) 
     cipher = AES.new(key, AES.MODE_CFB, iv) 
     return salt + iv + cipher.encrypt(data) 

    def decrypt(self,msg): 
     key = KDF.PBKDF2(self.pwd,msg[:8]) 
     cipher = AES.new(key, AES.MODE_CFB, msg[8:24]) 
     return cipher.decrypt(msg[24:]) 

Merci d'avance.

+0

Oui, vous avez raison. – decadenza

Répondre

1

Oui, c'est une bonne pratique et une bonne méthode pour fournir le sel de dérivation et iv au code de déchiffrement. PBKDF fournit une sécurité substantielle contre les attaques par mot de passe par force brute ainsi qu'une clé de longueur correcte.