1. 程式人生 > >MySQL 8.0 加密解密函式

MySQL 8.0 加密解密函式

MySQL的加密和解密函式個人分為兩類:
1.只支援正向加密不支援反向解密的函式:
MD5()、SHA1()|SHA()、SHA2()
針對此類加密的演算法MySQL不提供解密,但是我們可以通過網站
http://www.cmd5.com/ 反向解密。
改網站支援MD5、SHA、SHA256、SHA512等解密。

2.支援加密和解密的函式:
COMPRESS(),UNCOMPRESS():普通的加密和解密演算法。
ENCODE(),DECODE():普通的加密和解密演算法
DES_ENCRYPT(),DES_DECRYPT():支援DES演算法的加密和解密。
AES_DECRYPT(),AES_ENCRYPT():支援AES演算法的加密和解密。
ASYMMETRIC_ENCRYPT(),ASYMMETRIC_DECRYPT():簽名加密和解密。
STATEMENT_DIGEST(),STATEMENT_DIGEST_TEXT():針對語句進行hash演算法和反向解析。


3.第三類:
3.1
ASYMMETRIC_DERIVE()
ASYMMETRIC_SIGN()
ASYMMETRIC_VERIFY()
CREATE_ASYMMETRIC_PRIV_KEY() 建立私鑰
CREATE_ASYMMETRIC_PUB_KEY()  建立公鑰


3.2
CREATE_DH_PARAMETERS() 生成DH祕鑰
CREATE_DIGEST()        字串digest
PASSWORD()           返回加密的密碼,此函式在MySQL8.0被移除。
RANDOM_BYTES()       生成隨機向量值。
UNCOMPRESSED_LENGTH()  返回加密前的字串長度。
VALIDATE_PASSWORD_STRENGTH() 密碼強度的驗證值。

上述加密演算法中的 MD5(), SHA(), SHA1(), SHA2(),STATEMENT_DIGEST(), STATEMENT_DIGEST_TEXT().
返回的是ASCII字元,字元由引數character_set_connection和collation_connection決定。當設定為binary時則不受影響。
mysql> show variables like '%connection';
+---------------------------+--------------------+
| Variable_name             | Value              |
+---------------------------+--------------------+
| character_set_connection  | utf8mb4            |
| collation_connection      | utf8mb4_unicode_ci |
| default_master_connection |                    |
+---------------------------+--------------------+
3 rows in set (0.001 sec)

示例:
1.MD5加密
mysql> select md5('123456') MD5;
+----------------------------------+
| MD5                              |
+----------------------------------+
| e10adc3949ba59abbe56e057f20f883e |
+----------------------------------+
1 row in set (0.00 sec)
MD5返回的字串是32bit的,若要儲存的話可以使用char(32).
若要將這類資訊轉換為16進位制的複雜格式,可以使用UNHEX()函式和binary(16)儲存。
mysql> create table wuhan.t_md5 as select unhex(md5('123456')) hex_md5;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from wuhan.t_md5;
+------------------+
| hex_md5          |
+------------------+
| 9IV       |
+------------------+
1 row in set (0.00 sec)

mysql> desc wuhan.t_md5;
+---------+---------------+------+-----+---------+-------+
| Field   | Type          | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| hex_md5 | varbinary(64) | YES  |     | NULL    |       |
+---------+---------------+------+-----+---------+-------+
1 row in set (0.00 sec)


2.SHA 加密:SHA等同於SHA1,SHA加密演算法比MD5更加安全。
mysql> select sha('123456');
+------------------------------------------+
| sha('123456')                            |
+------------------------------------------+
| 7c4a8d09ca3762af61e59520943dc26494f8941b |
+------------------------------------------+

3.SHA2加密:
SHA2(str, hash_length)
hash_length支援的值224, 256, 384, 512, or 0。0等同於256.
mysql> select sha2('123456',0) A,sha2('123456',256) B\G   
*************************** 1. row ***************************
A: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
B: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
1 row in set (0.01 sec)

預計國內很多中小創業公司,和一些IT公司可能使用的加密演算法就是上面的幾種。
本人在網上收集到的一些密碼,可以看到大部分的國人使用的密碼都很簡單,很容易猜測和密碼碰撞到的。
Password_encrypt                  peoples  plain_text  
--------------------------------  -------  ------------
e10adc3949ba59abbe56e057f20f883e     1735  123456      
c33367701511b4f6020ec61ded352059       67  654321      
21218cca77804d2ba1922c33e0151105       54  888888      
670b14728ad9902aecba32e22fa4f6bd       49  000000      
96e79218965eb72c92a549dd5a330112       30  111111      
f379eaf3c831b04de153469d1bec345e       22  666666      
25d55ad283aa400af464c76d713c07ad       20  12345678    
25f9e794323b453885f5181f1b624d0b       19  123456789   
e35cf7b66449df565f93c607d5a81d09       16  456789      
fcea920f7412b5da7be0cf42b8c93759       14  1234567 
排名前十的密碼,佔比密碼取樣的25%。