MYSQL AES暗号化と復号化関数の使用
1388 ワード
最近、プロジェクトをするときは、1つの数字列を暗号化する必要がありますが、暗号化された暗号文は逆転できる必要があります.そのため、md 5やshaなどは使用できません.aesやdesしか使用できません.資料をめくってphp層で暗号解読を試み,phpの暗号化関数ライブラリを用いたが,同じ明文と鍵を用いてaes暗号化を行うたびに,得られた密文は毎回異なるが,復号時には同じ明文が得られることが分かった.これがaesのメリットです.PHPレイヤで数字列を暗号化し、完了したらテーブルに挿入するのは完全に正しい.しかし、テーブルにこの数字列が存在するかどうかを判断するのは難しい.同じ明文と鍵で演算された密文は前回とは異なるからだ.これでSELECT*FROM table WHERE column=?このパラメータの値は必ずペアリングされず、記録が見つからない.もう一つの方法は、テーブルのレコードを取り出し、ループ復号によって入力されたパラメータとペアリングする方法もありますが、これはよくありません.チェックするたびにテーブルとループ復号を遍歴し、メモリとCPUが切れると推定されます.仕方なく、データベース・レイヤで方法を探すしかありません.
では、MySQLという層で試してみると、MySQLにもaes暗号化の関数があることがわかりました.試してみてください.実験が終わると、MySQLの実現はphpとは異なり、MySQLから出るたびに秘密文が同じであることが分かった.これはあまり適切ではないように見えますが、まずそうします.MySQLのaes関数で暗号化された文字列はバイナリで、テーブルに挿入するには16進数に変換する必要があります.
本住所:http://ryan-d.iteye.com/blog/1562802
では、MySQLという層で試してみると、MySQLにもaes暗号化の関数があることがわかりました.試してみてください.実験が終わると、MySQLの実現はphpとは異なり、MySQLから出るたびに秘密文が同じであることが分かった.これはあまり適切ではないように見えますが、まずそうします.MySQLのaes関数で暗号化された文字列はバイナリで、テーブルに挿入するには16進数に変換する必要があります.
-- AES
SELECT AES_ENCRYPT('1234567890123456','abcdefgh');
-- AES
SELECT AES_DECRYPT(AES_ENCRYPT('1234567890123456','abcdefgh') ,'abcdefgh') ;
-- AES 16
SELECT HEX(AES_ENCRYPT('1234567890123456','abcdefgh'));
-- AES 16 ,
SELECT AES_DECRYPT(UNHEX(HEX(AES_ENCRYPT('1234567890123456','abcdefgh'))),'abcdefgh');
本住所:http://ryan-d.iteye.com/blog/1562802