2011-12-15 8 views
4

暗号化されていても回復可能な(管理者による)パスワードをMySQLからPHPに保存する必要があります。 AFAIK、これを行う最も簡単な方法はopenssl_public_encrypt()ですが、どのカラムタイプが必要かわかりません。キーのサイズと入力に基づいて、暗号化された出力の最大長を確実に判断することはできますか?MySQLデータベースでopenssl_public_encrypt()をどのように保存するのですか?

巨大なフィールド(例:BLOB)を使用することを余儀なくされました。

+0

パスワードを可逆暗号化で保存することは悪い考えです。代わりに塩漬けされたハッシュを使うべきです。 – Johan

+0

私の質問の前提条件です。 –

答えて

2

openssl_public_encryptファンクションは、キーの長さまで暗号化できるデータのサイズを制限します。パディングを使用すると(推奨)、余分な11バイトが失われます。

ただし、OpenSSLが使用するPKCS#1標準では、セキュリティを失うことなく少量の暗号化を行うことができるため、パディングスキームが指定されています。パディングスキームには最低11バイト必要です暗号化している値は小さくなります)。このため、1024ビットキーで暗号化できるビット数は最大936ビットです(OPENSSL_NO_PADDINGフラグを追加してパディングを無効にしない限り、1023-1024ビットまで増やすことはできません)。 2048ビットの鍵では1960ビットです。もちろん

あなたは、決して無効にパディングをする必要があることは同じ値に暗号化するために同じパスワードを行いますので。

したがって、1024ビットキーの場合、パスワードの最大入力文字数は117文字です。
2048ビットのキーは245文字です。

出力の長さは100%ではありませんが、簡単な証跡でこれを確認する必要があります。出力は鍵長の単純な関数なので、2048ビットの鍵では256バイトと思われます。

パスワードを保存するのに必要な長さのbinary文字列を使用する必要があります。
スピード上の理由から、限られた長さのインデックスをフィールドに使用することをお勧めします。
BLOB(!)を使用しないでください。

CREATE TABLE user 
    id unsigned integer auto_increment primary key, 
    username varchar(50) not null, 
    passRSA binary(256),  <<-- doublecheck the length. 
    index ipass(passRSA(10)) <<-- only indexes the first 10 bytes for speed reasons. 
) ENGINE = InnoDB 

インデックスに余分なバイトを追加すると、インデックスファイルが遅くなっても効果がないだけです。

+0

状態の出力は厳密にキーの長さの関数であることを示すドキュメント参照はありますか?私はいつもテストを実行することができますが、それはテストケースの外で私のデザインを証明するものではありません。 –

+0

@CakeLad、それはアルゴリズムの論理的な結果です。 – Johan

関連する問題