亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL利用AES_ENCRYPT()與AES_DECRYPT()加解密的正確方法示例

2024-07-24 13:14:19
字體:
來源:轉載
供稿:網友

前言

最近在工作中遇到一個需求是這樣的:需要在使用AES_ENCRYPT()函數將明文加密,存儲在MySQL中,但是遇到了一些問題……下面就來詳細介紹下。

說將加密后的密文,解密取出來是NULL。

看了一下,她發過來的表結構:

mysql,aes,encrypt,decrypt,aes加密

再看了她通過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/51291.html">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)

當然,屬性括號內的長度要取決于明文的長度,此處明文較短,故只給了16。

方法②:

將密文十六進制化,再存入varchar/char列。

此處需要用到HEX()來存入,用UNHEX()取出。

創建一個字符串屬性的字段。

將'hello world'先用密鑰'key2'進行AES加密,再將加密后的串通過HEX函數十六進制化。

最后先將加密后的串通過UNHEX取出,再通過AES據密鑰'key2'解密:

mysql> CREATE TABLE t_passwd_2(pass1 char(32));Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO t_passwd_2 VALUES (HEX(AES_ENCRYPT('hello world', 'key2')));Query OK, 1 row affected (0.00 sec)mysql> SELECT AES_DECRYPT(UNHEX(pass1), 'key2') FROM t_passwd_2; +-----------------------------------+| AES_DECRYPT(UNHEX(pass1), 'key2') |+-----------------------------------+| hello world   |+-----------------------------------+1 row in set (0.00 sec)

同樣,根據明文的長度不同,AES_ENCRYPT加密后的串長度也會有所變化,所以HEX后的字符串長度也會有所變化。
實際使用時,需要據業務評估出一個合理值即可。

方法③:

直接存入varchar中,不做十六進制化。

回溯到問題的一開始,將加密后的串,存到utf8字符集并且屬性為varchar中,是不行的。

實際上,將字符集改成latin1就可以了:

在insert的時候也不會報warning了。

mysql> CREATE TABLE t_passwd_3(pass varchar(32)) CHARSET latin1;Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t_passwd_3 SELECT AES_ENCRYPT('text', 'key3');Query OK, 1 row affected (0.00 sec)Records: 1 Duplicates: 0 Warnings: 0mysql> SELECT AES_DECRYPT(pass, 'key3') FROM t_passwd_3;+---------------------------+| AES_DECRYPT(pass, 'key3') |+---------------------------+| text   |+---------------------------+1 row in set (0.00 sec)

這樣的方法雖然美,只需將字段字符集設置為latin1就可以了,但可能會帶來隱患:

文檔上寫了這樣的一句:

Many encryption and compression functions return strings for which the result might contain arbitrary byte values. If you want to store these results, use a column with a VARBINARY or BLOB binary string data type. This will avoid potential problems with trailing space removal or character set conversion that would change data values, such as may occur if you use a nonbinary string data type (CHAR, VARCHAR, TEXT).

大意是,如果用方法③那樣,直接將加密后的串存入char/varchar/text類型中,在做字符轉換的時或空格被刪除時,可能會帶來潛在的影響。

所以如果一定要存在char/varchar/text中,那么還是參考方法②,十六進制化一下吧。

或者如同方法①,直接存在二進制字段中。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。

參考文檔:

Chapter 12 Functions and Operators - 12.13 Encryption and Compression Functions


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内免费精品永久在线视频| 欧美电影在线观看网站| 欧美高跟鞋交xxxxxhd| 全亚洲最色的网站在线观看| 欧洲成人免费视频| 欧美日本高清一区| 精品亚洲永久免费精品| 91免费人成网站在线观看18| 欧美成人免费全部观看天天性色| 在线精品91av| 久热精品视频在线观看| 一区二区三区国产在线观看| 亚洲国产精品一区二区三区| 亚洲欧美综合区自拍另类| 91精品国产综合久久香蕉的用户体验| 欧美国产激情18| 亚洲国产欧美精品| 欧美激情视频一区| 国产一区欧美二区三区| 亚洲激情在线观看| 欧美放荡办公室videos4k| 亚洲自拍高清视频网站| 欧美激情视频在线观看| 久久精品青青大伊人av| 国产精品视频不卡| 国产精品最新在线观看| 国内偷自视频区视频综合| 亚洲国产欧美一区二区三区同亚洲| 日韩视频免费大全中文字幕| 米奇精品一区二区三区在线观看| 欧美日韩成人网| 午夜精品久久久久久99热| 伊人久久久久久久久久| 九色精品美女在线| 久久久久亚洲精品成人网小说| 久久精彩免费视频| 日韩免费av在线| 午夜精品福利电影| 日本免费久久高清视频| 欧美激情精品久久久久久黑人| 久久久免费av| 欧美激情按摩在线| 日韩av高清不卡| 亚洲系列中文字幕| 国产一区二中文字幕在线看| 亚洲一区二区久久| 91美女片黄在线观看游戏| 亚洲美女视频网站| 国产丝袜精品第一页| 亚洲人成电影网| 国产精品a久久久久久| 欧美大成色www永久网站婷| 亚洲精品欧美一区二区三区| 色播久久人人爽人人爽人人片视av| 色妞久久福利网| 欧美激情视频一区二区三区不卡| 另类美女黄大片| 欧美日韩在线免费观看| 永久免费毛片在线播放不卡| 欧美黄色免费网站| 96sao精品视频在线观看| 精品亚洲一区二区三区四区五区| 国产精品白嫩初高中害羞小美女| 日韩av日韩在线观看| 国产精品高清在线观看| 久久久噜久噜久久综合| 欧美日韩在线免费观看| 国产日韩欧美在线观看| 欧美激情视频播放| 中文字幕亚洲天堂| 国产精品国产三级国产aⅴ浪潮| 最近的2019中文字幕免费一页| 菠萝蜜影院一区二区免费| 国产精品海角社区在线观看| 韩国欧美亚洲国产| 欧美成人第一页| 91精品视频免费观看| 91在线视频一区| 一区二区三区国产在线观看| 亚洲欧美日韩成人| 欧美成人精品在线播放| 97精品在线视频| 国产精品第2页| 中国china体内裑精亚洲片| 欧美激情二区三区| 久久亚洲精品中文字幕冲田杏梨| 欧美一级高清免费播放| 97在线观看视频国产| 亚洲黄色在线看| 欧美一级电影免费在线观看| 久久视频在线免费观看| 久久久久国产精品免费网站| 国产suv精品一区二区三区88区| 欧美日韩精品中文字幕| 久久国产天堂福利天堂| 亚洲一区二区在线| 日韩av免费在线播放| 欧美精品18videosex性欧美| 日韩视频一区在线| 欧美日韩国产va另类| 色小说视频一区| 亚洲欧洲av一区二区| 日韩欧美福利视频| 亚洲成人三级在线| 色无极影院亚洲| 久久天天躁狠狠躁老女人| 欧美大胆在线视频| 国产日产久久高清欧美一区| 国产视频一区在线| 色偷偷av一区二区三区乱| 亚洲福利视频久久| 亚洲另类欧美自拍| 日韩久久精品电影| 亚洲视频在线免费看| 日韩av电影手机在线观看| 欧美极品少妇xxxxⅹ免费视频| 日韩美女在线播放| 91精品免费看| 色综合久久88色综合天天看泰| 欧美综合第一页| 日韩亚洲欧美成人| 按摩亚洲人久久| 久国内精品在线| 国产精品美女视频网站| 亚洲国产天堂久久国产91| 欧美日韩美女视频| 人人爽久久涩噜噜噜网站| 欧美亚洲在线播放| 国产精品久久久久久网站| 欧美日韩亚洲一区二区三区| 欧美激情久久久久| 欧美国产日韩免费| 一区二区三区久久精品| 亚洲欧美日韩一区二区在线| 日韩毛片中文字幕| 色综合久久88色综合天天看泰| 96pao国产成视频永久免费| 亚洲综合精品伊人久久| 日韩免费视频在线观看| 亚洲三级 欧美三级| 91精品久久久久久综合乱菊| 精品国产91久久久久久老师| 欧美日韩国产精品| 2018国产精品视频| 欧美性猛xxx| 国产精品久久电影观看| 美日韩精品免费视频| 亚洲欧美激情在线视频| 亚洲人成在线免费观看| 欧美日在线观看| 亚洲欧美一区二区激情| 国产一区二区免费| 最近2019年手机中文字幕| 亚洲福利视频久久| 国产视频一区在线| 亚洲第一精品夜夜躁人人躁| 国产日本欧美一区| 日韩在线一区二区三区免费视频| 8090成年在线看片午夜| 日韩精品视频在线观看免费| 456亚洲影院| 亚洲美女性生活视频| 国产精品jizz在线观看麻豆| 国产一区二区动漫|