国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

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

2024-07-24 13:14:19
字體:
供稿:網(wǎng)友

前言

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

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

看了一下,她發(fā)過來的表結(jié)構(gòu):

mysql,aes,encrypt,decrypt,aes加密

再看了她通過AES_DECRYPT()函數(shù)加密了一個字符串,然后insert進去了,執(zhí)行成功后,顯示了一個warning:
Query OK, 1 row affected, 1 warning (0.00 sec)

(沒有報錯而是warning,大概是sql_mode的緣故)

此時她忽略了這個warning,再通過AES_DECRYPT()解密后,發(fā)現(xiàn)取出來的明文為NULL。

再回看表結(jié)構(gòu),發(fā)現(xiàn)其字段屬性為“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)

查了一下文檔,看一下這兩個函數(shù)的使用:

-- 將'hello world'加密,密鑰為'key',加密后的串存在@pass中mysql> SET @pass=AES_ENCRYPT('hello world', 'key'); Query OK, 0 rows affected (0.00 sec)-- 看一下加密后串的長度(都為2的整數(shù)次方)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類型,等二進制字段屬性。

創(chuàng)建三個字段,屬性分別為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)

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

方法②:

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

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

創(chuàng)建一個字符串屬性的字段。

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

最后先將加密后的串通過UNHEX取出,再通過AES據(jù)密鑰'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)

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

方法③:

直接存入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類型中,在做字符轉(zhuǎn)換的時或空格被刪除時,可能會帶來潛在的影響。

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

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

總結(jié)

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

參考文檔:

Chapter 12 Functions and Operators - 12.13 Encryption and Compression Functions


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产美女在线播放| 国产偷倩在线播放| 黄色电影网站在线观看| 亚洲欧美久久婷婷爱综合一区天堂| 国产福利片在线| av免费在线观看网站| 人人九九精品| 尤物视频在线免费观看| 国产高清视频在线播放| 在线看a视频| 国产有码在线| 国产对白在线| 麻豆视频在线观看免费网站| 91av资源在线| 亚洲最新永久观看在线| 国产女王在线**视频| 日本在线观看网站| 国产在线视精品麻豆| 天堂中文在线视频| av在线第一页| 国产精品福利视频一区二区三区| 亚洲色婷婷综合开心网| 天堂在线中文| 国产在线观看a| 性国产高清在线观看| 国产黄a三级三级三级av在线看 | 欧美日韩视频精品二区| 国产桃色电影在线播放| 蜜桃av在线免费观看| 91涩漫在线观看c| 国产美女高潮一区二区三区| av在线电影观看| 在线色视频观看| 国产成人久久精品77777| 午夜视频在线免费 | 性网站在线观看| 18成年在线观看| 国产视频二区三区| 天堂在线视频| 最新天堂资源在线资源| 最新中文字幕av专区| 国产免费一级| www在线视频观看| 日本国产在线| 久久国产精品久久久久久小说| 精品国产高清a毛片无毒不卡| 国产精品蜜臀| 国产二级c片l毛片| 在线中文视频| sese在线视频| 黄色片大全在线观看| 五月婷婷导航| 精品一区二区91| jlzzjlzz欧美大全| 高清视频一区二区三区四区| 国产羞羞视频| 中文天堂av| 亚洲视频网站在线| 国产中文在线观看| 国产午夜在线观看| 在线观看免费视频一区二区三区| 亚洲男人的天堂成人| 狠狠操狠狠色| 91桃色在线| 国产美女性感在线观看懂色av| 国产三级做爰在线观看| 在线久久视频| 五月天天在线| 99福利在线| 国产精品外围在线观看| 国产porn在线| 国产精品一区牛牛影视| 国产精品va在线观看视色| 青青国产在线| 精品视频一二三| 中文字幕在线免费观看| 怡红院av在线| 国产精品久久久精品a级小说| 免费的黄网站在线观看| 精品电影在线| 国产精品99爱免费视频| 狠狠操狠狠色| 亚洲精品在线播放视频| 国产精品入口麻豆免费观看| 久久五月精品| www.操操| 日本福利在线观看| 精品国产高清自在线一区二区三区 | 羞羞视频在线观看免费| 成网站在线观看人免费| 香蕉视频在线看| 精品国产免费第一区二区| 国产一级在线| 久久久久久国产视频| 中文乱码字幕高清在线观看| 国产精品视频一区二区久久 | 伊人影院在线播放| 国产天堂在线播放视频| 国产69精品久久久久孕妇国产69久久 | 久久亚洲国产成人亚| 伊人网在线视频| 在线免费观看污| 99色在线观看| 在线观看av网站| 午夜影院在线| 国产在线观看av| 国产一区二区影视| 国产视频三区| 四虎a级欧美在线观看| 免费女人毛片视频| 国产在线播放av| 国产日韩欧美第一页| 国产成人亚洲综合小说区| 97一区二区三区| 日本在线天堂| 成年黄网站在线观看免费| 国产免费专区| 国产二区在线播放| 一区二区三区免费视频网站| 在线黄色.com| 好吊日视频在线观看| 国产精品久久久久久久牛牛 | 18 激情视频在线| 在线免费观看你懂的| 欧美日韩**字幕一区| 最近中文字幕mv免费高清视频8 | 精品成人免费自拍视频 | 一本免费视频| av在线不卡免费| 高清在线观看av| 国产精品扒开做爽爽爽的视频| 国产黄色免费| www.av在线| 国产高清在线| 九七电影韩国女主播在线观看| 免费观看v片在线观看| 国产小视频免费在线网址| 中文字幕日本三级| 精品网站www| 亚洲v片在线观看| 成人精品一区二区三区免费| 国产成人午夜电影| 久久久久久国产视频| 91欧美在线视频| 国产美女免费观看| wwww亚洲| 亚洲wwwwww| 国产丝袜在线观看视频| 日本一卡二卡四卡精品| 九九色在线观看| 国产国产人免费人成免费视频| 日本电影全部在线观看网站视频| 最新中文字幕av专区| www.成人.com| av小说在线| 最新国产在线| 国内a∨免费播放| 日本视频三区| av免费在线观| 精品国产一区二区三区不卡在线 | 国产色在线播放| av在线资源网| 精品51国产黑色丝袜高跟鞋| 1区2区3区在线| 国产一二三区在线| 中文字幕国产视频| 国产人成高清视频观看| 国产系列在线观看| 国产经典av| av免费在线一区二区三区| 99色在线观看| av免费在线播放| 在线一二三区| 先锋av资源网| gogo高清在线播放免费| baoyu777.永久免费视频| 国产激情视频一区二区三区| 国产精品免费视频一区一| 亚洲图区综合| 欧美日韩**字幕一区| 九九在线视频| 国产精品久久麻豆| 亚洲成人av高清| 日韩av成人| 亚洲综合在线不卡| 久久久久久久久免费视频| 国产视频在线播放| 伊人222成人综合网| 九九热视频免费观看| 国产乱视频在线观看| 国产日产一区二区| 国产高清在线视频| 免费在线超碰| 国产情侣高潮对白| 操操操综合网| 中文字幕av高清在线观看| 国产美女在线一区二区三区| 91在线中文| 91av资源在线| 亚洲综合激情六月婷婷在线观看 |