2016-08-09 8 views
0

私は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も同じエラー)

私は、これは、不適切なエンコーディングとは何かである必要があります知っています。これを修正するための正しい方法は何ですか?各バイトを文字列に変換する必要がありますか?

ありがとうございました。

答えて

1

CharFieldにバイナリデータを保存しようとしているようです。フィールドタイプをuser.ivuser.secret_valueからBinaryFieldに変更するか、たとえばbase64エンコーダを使用してこれらの値をエンコードします。

+0

ありがとう、私はbas64をインポートし、保存する前にb64encode(secret_value)を実行することで修正しました。 – Nick

関連する問題