MySQLでパスワードを保存したかったので色々調べました。
どうもAES_ENCRYPT関数とAES_DECRYPT関数というのが安全性が高くていいらしい。
MySQL4.0.2以降で利用可能で、AES(Advanced Encryption Standard)アルゴリズムでデータの暗号化/解読を行うそうです。
以下にサンプルを記します。
[SQL]
INSERT INTO table VALUES (AES_ENCRYPT('text', 'key_string'))
textという文字列をkey_stringを使って暗号化してます。
複合化するときは以下のような感じ。
[SQL]
SELECT AES_DECRYPT(column_name, 'key_string') FROM table
column_nameに暗号化された情報が入っているとして、それをkey_stringで複合化してます。
暗号化と複合化に使うkey_stringは同じものを使うように。
それと自分がハマったんですが、暗号化された情報を入れるカラムの型はblob型です。
varchar型に入れようとすると、長さが短くなったよくわからない文字列が入り、複合化するとNULLが返ってきます。
ちなみにblob型の長さは、パスワードの文字数に1を足して16の倍数で切り上げた分だけ必要です。
例をあげると、12文字までのパスワードを受け付ける場合は16、24文字まで受け付ける場合は32にする必要があります。
バイナリで保存したくない場合は、HEX関数でHEXダンプするとvarchar型でも保存できるそうですが、まぁそういうこともできるんだよー、という紹介までに留めておきます。
どうもAES_ENCRYPT関数とAES_DECRYPT関数というのが安全性が高くていいらしい。
MySQL4.0.2以降で利用可能で、AES(Advanced Encryption Standard)アルゴリズムでデータの暗号化/解読を行うそうです。
以下にサンプルを記します。
[SQL]
INSERT INTO table VALUES (AES_ENCRYPT('text', 'key_string'))
textという文字列をkey_stringを使って暗号化してます。
複合化するときは以下のような感じ。
[SQL]
SELECT AES_DECRYPT(column_name, 'key_string') FROM table
column_nameに暗号化された情報が入っているとして、それをkey_stringで複合化してます。
暗号化と複合化に使うkey_stringは同じものを使うように。
それと自分がハマったんですが、暗号化された情報を入れるカラムの型はblob型です。
varchar型に入れようとすると、長さが短くなったよくわからない文字列が入り、複合化するとNULLが返ってきます。
ちなみにblob型の長さは、パスワードの文字数に1を足して16の倍数で切り上げた分だけ必要です。
例をあげると、12文字までのパスワードを受け付ける場合は16、24文字まで受け付ける場合は32にする必要があります。
バイナリで保存したくない場合は、HEX関数でHEXダンプするとvarchar型でも保存できるそうですが、まぁそういうこともできるんだよー、という紹介までに留めておきます。
PR
トラックバック
トラックバックURL: