MYSQL AES加密与解密函数使用

    最近在做项目的时候,需要对一个数字串进行加密,但是加密密文又需要可以可以逆转,因此不能使用md5或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

 

你可能感兴趣的:(mysql)