前言
最近在工作中遇到一個需求是這樣的:需要在使用AES_ENCRYPT()函數將明文加密,存儲在MySQL中,但是遇到了一些問題……下面就來詳細介紹下。
說將加密后的密文,解密取出來是NULL。
看了一下,她發過來的表結構:

再看了她通過AES_DECRYPT()函數加密了一個字符串,然后insert進去了,執行成功后,顯示了一個warning:
Query OK, 1 row affected, 1 warning (0.00 sec)
(沒有報錯而是warning,大概是sql_mode的緣故)
此時她忽略了這個warning,再通過AES_DECRYPT()解密后,發現取出來的明文為NULL。
再回看表結構,發現其字段屬性為“varchar” && 字符集是ut8,檢查warning為下:
| mysql> show warnings;+---------+------+------------------------------------------------------------------------+| Level | Code | Message |+---------+------+------------------------------------------------------------------------+| Warning | 1366 | Incorrect string value: '/xE3f767/x12...' for column 'passwd' at row 1 |+---------+------+------------------------------------------------------------------------+1 row in set (0.00 sec) |
查了一下文檔,看一下這兩個函數的使用:
| -- 將'hello world'加密,密鑰為'key',加密后的串存在@pass中mysql> SET @pass=AES_ENCRYPT('hello world', 'key'); Query OK, 0 rows affected (0.00 sec)-- 看一下加密后串的長度(都為2的整數次方)mysql> SELECT CHAR_LENGTH(@pass);+--------------------+| CHAR_LENGTH(@pass) |+--------------------+| 16 |+--------------------+1 row in set (0.00 sec)-- 使用AES_DECRYPT()解密mysql> SELECT AES_DECRYPT(@pass, 'key');+---------------------------+| AES_DECRYPT(@pass, 'key') |+---------------------------+| hello world |+---------------------------+1 row in set (0.00 sec) |
那么到底該如何存呢?
方法①:
將字段屬性設置為varbinary/binary/四個blob類型,等二進制字段屬性。
創建三個字段,屬性分別為varbinary、binary、blob。
并將'明文1','text2','明文_text3'加密,密鑰為key,存入表中。
最后取出。
| mysql> CREATE TABLE t_passwd (pass1 varbinary(16), pass2 binary(16), pass3 blob);Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t_passwd VALUES (AES_ENCRYPT('明文1', 'key'), AES_ENCRYPT('text2', 'key'), AES_ENCRYPT('明文_text3', 'key')); Query OK, 1 row affected (0.01 sec)mysql> SELECT AES_DECRYPT(pass1, 'key'), AES_DECRYPT(pass2, 'key'), AES_DECRYPT(pass3, 'key') FROM t_passwd;+---------------------------+---------------------------+---------------------------+| AES_DECRYPT(pass1, 'key') | AES_DECRYPT(pass2, 'key') | AES_DECRYPT(pass3, 'key') |+---------------------------+---------------------------+---------------------------+| 明文1 | text2 | 明文_text3 |+---------------------------+---------------------------+---------------------------+1 row in set (0.00 sec) |