2017-05-18 2 views
0

私は、ユーザデータをpostgresテーブルに格納しているPythonサーバを持っている。私はdbのためにSQLiteを使い始めましたが、問題はありませんでしたが、postgresに変換すると、私はencr_passwordのユニコード符号化文字列を格納する問題に遭遇しました。符号化されたUnicode文字列をPostgresに保存するが、異なるランダムな文字列を取得する

CREATEuser格納する。このデータ:

{'fname': ['John'], 'encr_password': [b'$2b$14$NvAJc1nxSRpQnuK5iAUxyeMN9wobMShjUYxCpANlsYUn8M1qir1Tq'], 'email': ['[email protected]'], 'lname': ['Doe']}

しかし、私が受け取る私のPostgresサーバからのデータを検索するとき:もう一度

[{'encr_password': '\\x243262243134244675375137324b4953614c5a70706354355a756d712e77433365576d42554e4f47315a486c43593958353454474248494969726b43', 'fname': 'John', 'user_id': 1, 'email': '[email protected]', 'lname': 'Doe'}] 

を私の検索は、私が期待まさに戻り、その初期に保存されていますSQLiteを使用しているときにフォーム。

  • Pythonのサーバー3.5.2
  • 3.1.1
+2

「ユニコード符号化文字列」には実際には任意のバイナリデータが含まれていましたが、実際には開始文字列ではありませんでした。 'encr_password'のためにテキストの使用を止めるか、16進やbase64のようなデータをコード化するテキストフレンドリーな方法を使うべきです。 –

+0

私がabt bcryptを読んだところからパスワードと塩をbase64にハッシュします。私はちょうどbcryptライブラリによって要求される検証チェックのためにUTF-8にそれをあらかじめエンコードしておいたと思います。それが必要になるまでエンコーディングを削除すると、DBにVARCHAR(255)として保存するのは間違っていますか? p.s.私の質問に既に答えて、すばやく反応してくれてありがとう! –

+0

これは* base64ではありません。私はbcrypt関数が自動的にそれをbase64に変換するとは思わないでしょう...出力は単純にバイナリデータです。これを適切なテキストに変換するには、base64を自分で使用する必要があります。 –

答えて

0

bcryptのあなたがbyteaフィールドにBASE64形式のデータを無理に勧めているように見えます。あなたはそれをする必要はありません。バイナリを8進エスケープ形式または16進エスケープ形式のper the PostgreSQL manualに指定してください。

base64としてエンコードする必要がある場合は、textフィールドに格納します。または、encodeおよびdecode関数を使用して、入力および出力時にbase64を/からbyteaに変換することができます。

関連する問題