校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > MySQL利用AES_ENCRYPT()與AES_DECRYPT()加解密的正確方法示例

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

熱門標簽:百度地圖標注地方備注 地圖標注圖標素材入駐 電銷機器人價格多少錢一臺 好搜地圖標注 400電話申請什么好 電話機器人免費嗎 怎么辦理400電話呢 龍圖酒吧地圖標注 怎么申請400電話申請

前言

最近在工作中遇到一個需求是這樣的:需要在使用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)

當然,屬性括號內的長度要取決于明文的長度,此處明文較短,故只給了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: 0

mysql> 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中,那么還是參考方法②,十六進制化一下吧。

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

總結

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

參考文檔:

Chapter 12 Functions and Operators - 12.13 Encryption and Compression Functions

您可能感興趣的文章:
  • The MySQL server is running with the --read-only option so it cannot execute this statement
  • mysql數據庫mysql: [ERROR] unknown option ''--skip-grant-tables''
  • mysql視圖之確保視圖的一致性(with check option)操作詳解
  • MySQL存儲表情時報錯:java.sql.SQLException: Incorrect string value:‘\xF0\x9F\x92\xA9\x0D\x0A...’的解決方法
  • Mysql中的NULL和Empty String
  • javascript連接mysql與php通過odbc連接任意數據庫的實例
  • ubuntu下apt-get安裝和徹底卸載mysql詳解
  • mysql server is running with the --skip-grant-tables option
  • 利用pt-heartbeat監控MySQL的復制延遲詳解
  • MySQL pt-slave-restart工具的使用簡介

標簽:浙江 溫州 內江 撫順 汕尾 防疫工作 固原 廣西

巨人網絡通訊聲明:本文標題《MySQL利用AES_ENCRYPT()與AES_DECRYPT()加解密的正確方法示例》,本文關鍵詞  MySQL,利用,AES,ENCRYPT,與,DECRYPT,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL利用AES_ENCRYPT()與AES_DECRYPT()加解密的正確方法示例》相關的同類信息!
  • 本頁收集關于MySQL利用AES_ENCRYPT()與AES_DECRYPT()加解密的正確方法示例的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    色国产综合视频| 欧美体内she精高潮| 久久综合精品国产一区二区三区 | 黄色小说综合网站| 欧美一级生活片| 日韩国产精品91| 欧美二区三区的天堂| 亚洲第一成年网| 欧美日韩一区高清| 日韩高清在线一区| 91精品国产色综合久久| 日韩精品五月天| 91精品国产91综合久久蜜臀| 日日摸夜夜添夜夜添亚洲女人| 欧美日韩一区二区电影| 亚洲成精国产精品女| 欧美色综合天天久久综合精品| 亚洲国产日韩一区二区| 精品视频1区2区| 亚洲国产中文字幕在线视频综合| 在线免费观看日韩欧美| 亚洲va欧美va国产va天堂影院| 欧美日韩国产123区| 日韩专区中文字幕一区二区| 欧美一区永久视频免费观看| 麻豆精品一区二区| 2020日本不卡一区二区视频| 国产一区二区剧情av在线| 国产午夜亚洲精品不卡| 成人免费毛片嘿嘿连载视频| 自拍偷拍欧美精品| 欧美视频三区在线播放| 日韩电影在线免费看| 日韩视频在线观看一区二区| 国产精品影视在线观看| 国产精品无码永久免费888| 91老司机福利 在线| 亚洲高清免费在线| 日韩欧美精品三级| 国产不卡一区视频| 亚洲精品中文在线观看| 欧美精品九九99久久| 精品在线亚洲视频| 国产精品污网站| 欧美在线观看你懂的| 日韩电影一二三区| 国产欧美va欧美不卡在线| 91亚洲精品久久久蜜桃网站| 久久91精品久久久久久秒播| 日本一区二区三区四区| 欧美在线三级电影| 九色综合国产一区二区三区| 欧美国产日韩a欧美在线观看| 91年精品国产| 麻豆精品新av中文字幕| 中文字幕在线观看不卡视频| 欧美色区777第一页| 黄色精品一二区| 亚洲人成电影网站色mp4| 91精品国产免费久久综合| 国产精品系列在线播放| 亚洲综合男人的天堂| 欧美一区二区视频网站| 成人黄动漫网站免费app| 天堂影院一区二区| 中文字幕欧美日韩一区| 欧美精品色一区二区三区| 国产精品 欧美精品| 亚洲成在人线免费| 欧美经典三级视频一区二区三区| 欧美婷婷六月丁香综合色| 国精产品一区一区三区mba视频| 亚洲精品国产高清久久伦理二区| 精品美女在线播放| 欧亚洲嫩模精品一区三区| 国产麻豆9l精品三级站| 亚洲成a人片在线不卡一二三区| 久久精品夜色噜噜亚洲aⅴ| 欧美三级韩国三级日本三斤 | 视频一区二区欧美| 亚洲色欲色欲www在线观看| 精品日韩成人av| 欧美色综合网站| 成人黄色网址在线观看| 美女一区二区久久| 亚洲一区在线视频| 国产精品久久久久永久免费观看 | 欧美一区二区三区的| 99久久国产综合精品麻豆| 国产曰批免费观看久久久| 五月天精品一区二区三区| 成人欧美一区二区三区1314| 亚洲精品一区二区三区在线观看 | 欧洲中文字幕精品| 国产99精品国产| 久久精品免费观看| 亚洲午夜久久久久| 亚洲色图一区二区三区| 久久午夜色播影院免费高清| 337p亚洲精品色噜噜噜| 91热门视频在线观看| 国产乱子轮精品视频| 日韩电影免费在线观看网站| 亚洲综合激情网| 亚洲女人的天堂| 国产精品久久久一本精品| 久久综合狠狠综合久久综合88 | 日韩免费性生活视频播放| 欧美午夜在线一二页| 色综合天天综合网天天看片| 成人性生交大片免费看中文| 国产在线精品视频| 精品综合久久久久久8888| 日韩二区三区四区| 香蕉久久一区二区不卡无毒影院| 一区二区久久久久| 亚洲激情校园春色| 亚洲精品五月天| 亚洲少妇屁股交4| 自拍偷拍欧美精品| 亚洲日本一区二区三区| 国产精品成人免费| 自拍偷拍亚洲综合| 亚洲素人一区二区| 亚洲日本一区二区| 亚洲美女电影在线| 亚洲激情自拍偷拍| 亚洲一区二区三区四区不卡| 亚洲综合另类小说| 五月天一区二区三区| 亚洲成人黄色小说| 视频一区中文字幕国产| 日韩国产欧美一区二区三区| 日韩精品电影一区亚洲| 日韩精品五月天| 美女国产一区二区三区| 精品一区二区免费| 国产一区中文字幕| 高清av一区二区| 99久久精品国产一区二区三区| 99久久久精品免费观看国产蜜| 99久久免费视频.com| 91久久精品一区二区二区| 在线免费不卡视频| 91.成人天堂一区| 日韩女优电影在线观看| 久久亚洲精品小早川怜子| 国产女人水真多18毛片18精品视频 | 91浏览器入口在线观看| 欧洲精品一区二区三区在线观看| 欧美色网一区二区| 日韩三级av在线播放| 欧美精品一区二区久久久| 久久精品在这里| 日韩理论片网站| 一区二区三区免费网站| 天天色天天操综合| 精品一区二区三区蜜桃| 成人黄色一级视频| 欧美亚洲丝袜传媒另类| 91精品国产一区二区三区蜜臀| 日韩精品专区在线影院重磅| 日本一区二区三区在线不卡 | 一区二区三区在线视频播放| 亚洲va天堂va国产va久| 极品瑜伽女神91| www.av亚洲| 欧美日韩在线精品一区二区三区激情| 91精品国产色综合久久久蜜香臀| 精品久久久久99| 亚洲天堂网中文字| 日日欢夜夜爽一区| 国产福利精品导航| 94色蜜桃网一区二区三区| 91.com视频| 欧美国产精品一区| 婷婷开心久久网| 福利91精品一区二区三区| 欧美性色黄大片| 久久婷婷综合激情| 亚洲综合丝袜美腿| 韩国在线一区二区| 在线观看日韩国产| 亚洲精品在线免费播放| 亚洲视频你懂的| 精品一区二区三区视频在线观看| 99在线精品一区二区三区| 欧美一区二区三区在线电影| 国产精品视频线看| 日韩成人免费电影| 99精品欧美一区二区三区综合在线| 欧美一区二区三区日韩| 亚洲视频在线一区观看| 久久成人av少妇免费| 一本久久综合亚洲鲁鲁五月天| 精品久久久久一区二区国产| 一区二区三区精品视频| 国产福利一区二区三区视频在线| 欧洲一区二区三区免费视频| 国产视频在线观看一区二区三区 |