MySQL数据库中提供了很丰富的函数,这些函数可以帮助用户更加方便的处理表中的数据,他们会对传递进来的参数进行处理,并返回一个处理结果,也就是返回一个值。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。SELECT语句及其条件表达式都可以使用这些函数。同时,INSERT 、UPDATE、DELECT语句及其条件表达式也可以使用这些函数。本文主要讲解加密函数。加密函数是MySQL用来对数据进行加密的函数,函数列表如下:
函数名称 | 作 用 |
---|---|
PASSWORD | 对字符串str进行加密,不可逆 |
MD5 | 密码散列函数,计算字符串str的MD5校验和 |
SHA | FIFS 认证的安全散列算法,比 MD5 更安全 |
ENCODE(str,key) | 使用 key 作为加密秘钥对 str 进行加密,加密结果是二进制数 |
DECODE(crypt_str,key) | 对经过 ENCODE 加密之后的密文crypt_str进行解密 |
AES_ENCRYPT(str,key) | 用密钥key对字符串str利用高级加密标准算法加密 |
AES_DECRYPT(str,key) | 利用高级加密标准算法用密钥key对AES_ENCRYPT加密后的字符串str解密 |
1、PASSWORD(str)加密
该函数可以对字符串str进行加密,并返回加密之后的字符串,一般情况下,PASSWORD(str)用于给用户的密码加密,该加密函数不可逆,和UNIX密码加密过程使用不同的算法。
mysql> SELECT PASSWORD(123);
+----------------------------------+
| PASSWORD(123) |
+----------------------------------+
| *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+----------------------------------+
1 row in set (0.00 sec)
2、MD5(str)加密
MD5 是一种被广泛使用的加密方法,它是一个密码散列函数,该函数对原明文str计算出一个 MDS128 比特校验和,该值以 32 位十六进制数字的二进制字符串形式返回,该加密函数可逆(计算字符串str的MD5校验和)。
- 当你的保护对象发生变化后,其 MD5 的值也会不一样,所以 MD5 经常用来验证数据有没有被篡改。
mysql> select MD5(123);
+----------------------------------+
| MD5(123) |
+----------------------------------+
| 202cb962ac59075b964b07152d234b70 |
+----------------------------------+
1 row in set (0.00 sec)
3、SHA(str)加密
SHA 和 MD5 一样,也是一个密码散列函数,是 FIFS 认证的安全散列算法,比 MD5 更安全(计算字符串str的安全散列算法SHA校验和)。
mysql> select sha(123);
+------------------------------------------+
| sha(123) |
+------------------------------------------+
| 40bd001563085fc35165329ea1ff5c5ecbdbbeef |
+------------------------------------------+
1 row in set (0.00 sec)
4、ENCODE(str,key)加密
该加密函数使用 key 作为加密秘钥对 str 进行加密,加密结果是二进制数,需要使用BLOB类型的字段保存。该函数与DECODE()函数是一对,需要同样的秘钥才能够解密。
mysql> SELECT ENCODE('123', 'xxoo');
+------------------------------------------+
| ENCODE('123', 'xxoo') |
+------------------------------------------+
| ;vx |
+------------------------------------------+
1 row in set (0.00 sec)
5、DECODE(crypt_str,key)解密
DECODE解密函数使用 key 作为密钥,对经过 ENCODE 加密之后的密文crypt_str进行解密。
mysql> SELECT DECODE(';vx','xxoo');
+------------------------------------------+
| DECODE(';vx', 'xxoo') |
+------------------------------------------+
| 123 |
+------------------------------------------+
1 row in set (0.00 sec)
加密和解密函数放在一起验证:
mysql> SELECT DECODE(ENCODE('123', 'xxoo'),'xxoo');
+------------------------------------------+
| DECODE(ENCODE('123', 'xxoo'),'xxoo') |
+------------------------------------------+
| 123 |
+------------------------------------------+
1 row in set (0.00 sec)
6、AES_ENCRYPT(str,key)加密
返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储。AES_ENCRYPT函数接受两个参数,它们是加密的字符串和用于加密该字符串的 key 字符串。如果参数为NULL,则返回NULL。
mysql> SELECT AES_ENCRYPT('root','salt');
+------------------------------------------+
| AES_ENCRYPT('root','salt') |
+------------------------------------------+
| �&�r[Lu��S��6� |
+------------------------------------------+
1 row in set (0.00 sec)
可以在存入数据库的时候,转成十六进制。
create table t2(c1 varchar(64);
insert into t2 select hex(aes_encrypt(('root'),'salt'));
mysql> select * from t2;
+----------------------------------+
| c1 |
+----------------------------------+
| E02693725B4C1A75A3935383D936E120 |
+----------------------------------+
1 row in set (0.00 sec)
AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB
7、AES_DECRYPT(str,key)解密
返回用密钥key对字符串str利用高级加密标准算法解密后的结果。
mysql> SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key');
+------------------------------------------+
| AES_DECRYPT(AES_ENCRYPT('root','key'),'key') |
+------------------------------------------+
| root |
+------------------------------------------+
1 row in set (0.00 sec)
如果在加密后用hex转为了十六进制,解密之前要先用huhex函数转一次。
mysql> select aes_decrypt(unhex(c1),'salt') from t2;
+-------------------------------+
| aes_decrypt(unhex(c1),'salt') |
+-------------------------------+
| root |
+-------------------------------+
1 row in set (0.00 sec)
评论区