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.
Danke, ich habe es repariert, indem ich bas64 importiert habe und einfach b64encode (secret_value) vor dem Speichern gemacht habe. – Nick