2016-08-09 45 views
0

Ich arbeite mit PyCrypto in Django und ich muss eine Zeichenfolge mit dem geheimen Schlüssel des Benutzers, den sie selbst erstellt haben, verschlüsseln. Ich schrieb erfolgreich eine Verschlüsselungsmethode wie folgt:Django PyCrypto - Verschlüsselte Zeichenfolge in Datenbank speichern Schlechte Unicode-Daten

from Crypto.Cipher import AES 
from Crypto.Random import get_random_string 

def encrypt(value, key): 
    """ 
    Return an encryption of value under key, as well as IV. 
    Pads value with extra bytes to make it multiple of 16. 
    """ 
    extra = 16 - (len(value) % 16) 
    data = value + chr(extra) * extra 
    iv = get_random_bytes(16) 
    encryption_suite = AES.new(key, AES.MODE_CBC, iv) 
    cipher_text = encryption_suite.encrypt(data) 
    return cipher_text, iv 

Warum verwende ich keine Django-Verschlüsselungen? Da es eine Client-Anwendung gibt, die NICHT in Django geschrieben ist (und niemals sein wird), akzeptiert sie den verschlüsselten Wert, den der Benutzer zuvor gespeichert hat, und entschlüsselt ihn, sobald der Benutzer seinen geheimen Schlüssel eingibt.

Problem ist, dass ich nicht scheinen kann, den verschlüsselten Wert in der Datenbank für das Benutzermodell zu speichern. Zum Beispiel:

user = User.objects.get(id=user_id) 
cipher, iv = encrypt(user_value, user_key) 
user.secret_value = cipher 
user.iv = iv 
user.save() 

Der in diesem Fehler führt:

Warning: Incorrect string value: '\xE7\xAA\x13\x036\xC8...' for column 'iv' at row 1

(gleicher Fehler für secret_value)

Ich weiß, das etwas mit dem falschen Codierung zu tun sein muß. Was ist der richtige Weg, um das zu beheben? Soll ich jedes Byte in ein String-Zeichen umwandeln?

Danke.

Antwort

1

Ich denke, Sie versuchen, Binärdaten in CharField s zu speichern. Ändern Sie entweder die Feldtypen user.iv und user.secret_value in BinaryField, oder kodieren Sie diese Werte zum Beispiel mit dem base64-Encoder.

+0

Danke, ich habe es repariert, indem ich bas64 importiert habe und einfach b64encode (secret_value) vor dem Speichern gemacht habe. – Nick