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進数に変換する必要があります.
 
-- 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