暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 加密和压缩函数(2)

林员外聊编程 2021-07-26
897
● COMPRESS(string_to_compress)
 
压缩字符串并以二进制字符串的形式返回结果。这个函数需要使用压缩库(zlib)编译 MySQL。否则,返回值总是 NULL。可以使用 UNCOMPRESS() 来解压缩压缩后的字符串。
 
mysql> SELECT LENGTH(COMPRESS(REPEAT('a',1000)));
-> 21
mysql> SELECT LENGTH(COMPRESS(''));
-> 0
mysql> SELECT LENGTH(COMPRESS('a'));
-> 13
mysql> SELECT LENGTH(COMPRESS(REPEAT('a',16)));
-> 15
 
压缩字符串内容的存储方式如下:
 
■ 空字符串存储为空字符串。
 
■ 非空字符串存储为4字节长度的未压缩字符串(先是低字节),然后是压缩字符串。如果字符串以空格结束,则多加一个 .,如果结果存储在 CHAR VARCHAR 列中,则添加字符可以避免结束空间调整问题。(但是,不推荐使用 CHAR VARCHAR 等非二进制字符串数据类型来存储压缩字符串,因为可能会发生字符集转换。请使用 VARBINARY BLOB 二进制字符串列。)
 
如果从 mysql 客户端内部调用 COMPRESS(),二进制字符串将使用十六进制表示,这取决于 --binary-as-hex 的值。
 
● MD5(str)
 
计算字符串的 MD5 128 位校验和。该值以32个十六进制数字的字符串形式返回,如果参数为 NULL 则返回 NULL。返回值可以用作哈希键。
 
返回值是连接的字符集的字符串。
 
如果启用 FIPS 模式,MD5() 返回 NULL
 
mysql> SELECT MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'
 
● RANDOM_BYTES(len)
 
这个函数返回使用 SSL 库的随机数生成器生成的 len 随机字节的二进制字符串。允许的 len 值范围是 1 1024。对于超出该范围的值,将发生错误。
 
RANDOM_BYTES() 可用于为 AES_DECRYPT() AES_ENCRYPT() 函数提供初始化向量。在这种情况下,len 必须至少为 16。允许更大的值,但是超过 16 的字节将被忽略。
 
RANDOM_BYTES() 生成一个随机值,这使其结果具有不确定性。因此,使用此函数的语句对于基于语句的复制是不安全的。
 
如果 RANDOM_BYTES() mysql 客户端调用,二进制字符串显示使用十六进制表记法,具体取决于 --binary-as-hex 的值。
 
● SHA1(str), SHA(str)
 
计算字符串的 SHA-1 160位校验和,如 RFC 3174(安全哈希算法)中所述。返回值是一个由40个十六进制数字组成的字符串,如果参数为 NULL 则返回 NULL。该函数的一个可能用途是作为哈希键。SHA() SHA1() 的同义词。
 
返回值是连接的字符集的字符串。
 
mysql> SELECT SHA1('abc');
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
 
● SHA2(str, hash_length)
 
计算 SHA-2 哈希系列函数(SHA-224SHA-256SHA-384 SHA-512)。第一个参数是要进行哈希处理的纯文本字符串。第二个参数指示结果所需的位长,其值必须为 224256384512 0(等效于 256)。如果参数为 NULL 或哈希长度不是允许的值,则返回值为 NULL。否则,函数结果是一个包含所需位数的哈希值。
 
返回值的字符串采用连接的字符集。
 
mysql> SELECT SHA2('abc', 224);
-> '23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7'
 
只有当 MySQL 配置了 SSL 支持时,此函数才有效。
 
SHA2() 可以被认为在加密上比 MD5() SHA1() 更安全。
 
● STATEMENT_DIGEST(statement)
 
给定一个 SQL 语句作为字符串,返回语句摘要哈希值字符串,采用连接的字符集,如果参数为 NULL,则返回 NULL。相关的 STATEMENT_DIGEST_TEXT() 函数返回规范化的语句摘要。
 
这两个函数都使用 MySQL 解析器来解析语句。如果解析失败,则会出现错误。只有当语句以字面量字符串的形式提供时,错误消息才会包含解析错误。
 
max_digest_length 系统变量决定了这些函数用于计算规范化语句摘要的最大可用字节数。
 
mysql> SET @stmt = 'SELECT * FROM mytable WHERE cola = 10 AND colb = 20';
mysql> SELECT STATEMENT_DIGEST(@stmt);
+------------------------------------------------------------------+
| STATEMENT_DIGEST(@stmt) |
+------------------------------------------------------------------+
| 3bb95eeade896657c4526e74ff2a2862039d0a0fe8a9e7155b5fe492cbd78387 |
+------------------------------------------------------------------+
mysql> SELECT STATEMENT_DIGEST_TEXT(@stmt);
+----------------------------------------------------------+
| STATEMENT_DIGEST_TEXT(@stmt) |
+----------------------------------------------------------+
| SELECT * FROM `mytable` WHERE `cola` = ? AND `colb` = ? |
+----------------------------------------------------------+
 
● STATEMENT_DIGEST_TEXT(statement)
 
给定一个SQL语句作为字符串,返回规范化的语句摘要,此摘要字符串采用连接的字符集,如果参数为 NULL,则返回 NULL
 
● UNCOMPRESS(string_to_uncompress)
 
解压缩由 COMPRESS() 函数压缩的字符串。如果参数不是压缩值,则结果为 NULL。这个函数需要使用压缩库(zlib)编译 MySQL。否则,返回值总是 NULL
 
mysql> SELECT UNCOMPRESS(COMPRESS('any string'));
-> 'any string'
mysql> SELECT UNCOMPRESS('any string');
-> NULL
 
● UNCOMPRESSED_LENGTH(compressed_string)
 
返回字符串在被压缩之前的长度。
 
mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30)));
-> 30
 
● VALIDATE_PASSWORD_STRENGTH(str)
 
给定一个表示明文密码的参数,该函数返回一个整数,表示密码的强度。返回值的范围从0()100()
 
VALIDATE_PASSWORD_STRENGTH() 的密码评估是由 validate_password 组件完成的。如果该组件没有安装,函数总是返回 0。要检查或配置影响密码测试的参数,请检查或设置由 validate_password 实现的系统变量。
 
密码受到越来越严格的测试,返回值反映哪些测试满足,如下表所示。此外,如果 validate_password.check_user_name 系统变量被启用,并且密码与用户名匹配,VALIDATE_PASSWORD_STRENGTH() 返回 0,无论其他 validate_password 系统变量是如何设置的。
 
测试密码
返回值
长度 < 4
0
长度 4 并且 < validate_password.length
25
满足策略 1 (LOW)
50
满足策略 2 (MEDIUM)
75
满足策略 3 (STRONG)
100
 
 
 
 
 
官方文档:
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html
文章转载自林员外聊编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论