私はDjangoでPyCryptoを使用しています。自分が作成したユーザーの秘密鍵を使用して文字列を暗号化する必要があります。Django PyCrypto - 暗号化された文字列をデータベースに保存する不正なUnicodeデータ
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
なぜ私はDjangoの暗号化を使用していませんか? Djangoには書かれていないクライアントアプリケーションが存在するため、ユーザーが以前に保存した暗号化された値を受け入れ、ユーザーが秘密鍵を入力すると解読します。
問題は、ユーザーモデルのデータベースに暗号化された値を保存できないようです。
user = User.objects.get(id=user_id)
cipher, iv = encrypt(user_value, user_key)
user.secret_value = cipher
user.iv = iv
user.save()
これは、このエラーが発生:たとえば
Warning: Incorrect string value: '\xE7\xAA\x13\x036\xC8...' for column 'iv' at row 1
(secret_valueも同じエラー)
私は、これは、不適切なエンコーディングとは何かである必要があります知っています。これを修正するための正しい方法は何ですか?各バイトを文字列に変換する必要がありますか?
ありがとうございました。
ありがとう、私はbas64をインポートし、保存する前にb64encode(secret_value)を実行することで修正しました。 – Nick