2011-12-15 9 views
1

私はweb.pyでアプリケーションを構築していますが、暗号化されたデータをMySQLに格納する際にはいくつか問題があります。PyCryptoライブラリから生成された暗号文をMySQLが正しく格納していない

PyCryptoがどのように見えるCYPHERテキスト作成:私は次のようにそれを格納してい???d H??[cZ? :印刷されたとき、しかし、MySQLはそれを記憶している 『ôdHïÐ[cZø

として表示され、「\x06\x7f\x81\xa0\xf4d\x00H\xef\xd0\x18[c\x18Z\xf8」を

query_string = "INSERT INTO %s (%s) VALUES (\"%s\")" % (table, column, value) 

私は、データベースに接続した後、「SET character_set_connection=utf8」を使用してみましたが、それは結果に変化は得られませんでした。

私は明らかに非常に重要なことがありません。何かご意見は?

+0

テーブル自体に文字エンコーディングを設定する必要はありませんか? – Poodlehat

答えて

3

MySQLはであなたのバイトの文字列を格納しようとしています文字列。接続文字セットはUTF-8ですが、バイト文字列が有効なUTF-8シーケンスを表していないため、文字列はマングリングされます。

  1. が列BINARYタイプ(または一般的にバイナリ照合と文字型)を作成し、

  2. 使用はにクエリをパラメータ化:必要に適切にデータベースに生のバイトを取得するには

    非バイナリ(Unicode)コンテンツと混在する可能性のあるクエリ文字列にデータを挿入するのではなく、データベースにデータを取得します。

エスケープされていない文字列補間は、SQLインジェクションに対して脆弱ですので、とにかくパラメータ化されたクエリを使用してください。以下のように見えるかもしれませんweb.pyで:

query_string= 'INSERT INTO %s (%s) VALUES ($value)' % (table, column) 
db.query(query_string, vars= {'value': value}) 

tablecolumn値が既知の良好なされていると仮定。)

このようにすると、ドル記号が心配する必要もありません。

もう1つの方法は、非ASCIIバイトをエンコードする通常の文字列を使用する方法です。現在の回避策ではuucodeでこれをやっていますが、Base64はPython(ciphertext.encode('base64'))に入るのがより簡単な代替手段です。 16進符号化(.encode('hex'))は、ハッシュの場合に最も一般的です。

+0

うわー。素晴らしい説明に感謝します。私は、バイナリに列を設定しようとしましたが、私はクエリをparamterizeしなかったので、それは問題が続いた。私はあなたが私にここに与えたものを試してみます! –

+0

これは、カラムをもう一度バイナリに設定した後で、web.db.SQLQuery(['column'、web.db.SQLParam(binaryValue)])を使用してクエリを作成することによって機能しました。再度、感謝します! –

0

私は解決策を考え出しました。私はそれがどれほどエレガントであるかは分かりませんが、私が理解できる最高のものでした。

ENCODING:

1)import binascii

2)ciphertext = cipher.encrypt(plaintext)

3)asciitext = binascii.b2a_uu(ciphertext)

4)webpy_workaround = asciitext.replace('$', 'DOLLARSIGN') //if there are dollar signs in the text, webpy will try to use anything afterward, and will complain at you.

5)ストアは、SQLにwebpy_workaround。

DECODING:

1)SQL

2から値を取得する)asciitext = sql_value.replace('DOLLARSIGN', '$')

3)ciphertext = binascii.a2b_uu(asciitext)

4)plaintext = cipher.decrypt(ciphertext)

関連する問題