表12.18加密函数
名称 | 描述 | 弃用 |
---|---|---|
aes_decrypt() |
使用AES解密 | |
AES_ENCRYPT () |
使用AES加密 | |
压缩() |
以二进制字符串的形式返回结果 | |
DECODE () |
解码使用CONCODE()加密的字符串 | 是的 |
des_decrypt() |
解密一个字符串 | 是的 |
des_encrypt() |
加密字符串 | 是的 |
编码() |
编码字符串 | 是的 |
加密() |
加密字符串 | 是的 |
MD5() |
计算MD5校验和 | |
密码() |
计算并返回密码字符串 | 是的 |
RANDOM_BYTES () |
返回一个随机字节向量 | |
SHA1() 那沙() |
计算SHA-1 160位校验和 | |
SHA2() |
计算SHA-2校验和 | |
解压缩() |
解压缩已压缩的字符串 | |
解压缩_length() |
在压缩前返回字符串的长度 | |
validate_password_strength() |
确定密码的强度 |
许多加密和压缩函数返回条件,结果可能包含任意字节值。如果要存储这些结果,请使用一个列varbinary.
或者团
二进制字符串数据类型。这避免了潜在的问题,尾随空间删除或字符集转换将改变数据值,例如如果您使用非边际字符串数据类型(字符
那varchar.
那文本
)。
一些加密函数返回ASCII字符字符串:MD5()
那密码()
那沙()
那SHA1()
那SHA2()
。它们的返回值是一个字符串,它具有由此确定的字符集和排序规则character_set_connection.
和Collation_Connection.
系统变量。除非字符集是一个非线性字符串二进制
。
如果应用程序存储函数的值,例如MD5()
或者SHA1()
它返回一个十六进制数字字符串,通过使用将十六进制表示形式转换为二进制,可以获得更有效的存储和比较UNHEX ()
并将结果存放在一个二进制(
柱子。每对十六进制数字需要二进制形式一个字节,因此值为N
)N
取决于十六进制字符串的长度。N
是16岁MD5()
值和20SHA1()
价值。为了SHA2()
那N
范围从28到32,具体取决于指定结果所需位长度的参数。
将十六进制字符串存储在字符
如果该值存储在使用该列的列中,则列至少是两次,最多八次,最多八次use utf8
字符集(每个字符使用4个字节)。存储该字符串也会导致比较较慢的比较,因为较大的值,并且需要将字符集进行整理规则考虑到帐户。
假设一个应用程序商店MD5()
字符串值Char(32)
专栏:
CREATE TABLE md5_tbl (md5_val CHAR(32),…);INSERT INTO md5_tbl (md5_val,…)值(MD5(六边形abcdef),…);
要将Hex String转换为更紧凑的表单,请修改应用程序使用UNHEX ()
和二进制(16)
而不是遵循:
创建表MD5_TBL(MD5_VAL二进制(16),......);插入MD5_TBL(MD5_VAL,...)值(HOVEL(MD5('abcdef')),......);
应准备应用程序来处理散列函数为两个不同输入值产生相同值的非常罕见的情况。一种碰撞可检测的方法是使哈希列成为主键。
用于MD5和SHA-1算法的利用已知。您可能希望使用此部分中描述的另一种单向加密功能,例如SHA2()
。
除非使用SSL连接,否则将作为加密函数的参数提供的密码或其他敏感值作为ClearText发送到MySQL服务器。此外,这些值出现在写入的任何MySQL日志中。为避免这些类型的曝光,应用程序可以在向服务器发送到服务器之前加密客户端的敏感值。相同的注意事项适用于加密密钥。为避免曝光这些,应用程序可以使用存储过程来加密和解密服务器端的值。
aes_decrypt(
Crypt_str.
那key_str
(,init_vector.
])此功能使用官方AES(高级加密标准)算法进行解密数据。有关更多信息,请参阅以下描述
AES_ENCRYPT ()
。使用的陈述
aes_decrypt()
基于语句的复制不安全,无法存储在查询缓存中。AES_ENCRYPT (
str.
那key_str
(,init_vector.
])AES_ENCRYPT ()
和aes_decrypt()
使用官方AES(高级加密标准)算法来实现数据的加密和解密,以前称为“rijndael。“AES标准允许各种关键长度。默认情况下,这些函数使用128位密钥长度实现AES。可以使用196或256位的键长度,如稍后所述。关键长度是性能和安全之间的折衷。AES_ENCRYPT ()
加密字符串str.
使用关键字串key_str
并返回包含加密输出的二进制字符串。aes_decrypt()
解密加密的字符串Crypt_str.
使用关键字串key_str
并返回原始的明文字符串。如果函数参数是空值
,函数返回空值
。这
str.
和Crypt_str.
参数可以是任何长度,并且自动添加填充str.
因此,它是根据AES的基于块的算法所要求的块的倍数。此填充自动删除aes_decrypt()
函数。长度Crypt_str.
可以使用此公式计算:16 *(trunc(string_length./ 16)+ 1)
对于128位的关键长度,将密钥传递到最安全的方式
key_str
参数是创建一个真正随机的128位值并将其传递为二进制值。例如:插入t值(1,aes_encrypt('text',hovex('f3229a0b371ed2d9441b830d21a390c3')))));
密码短语可以通过散列密码短语来生成AES密钥。例如:
插入t值(1,aes_encrypt('text',hovex(sha2('我的秘密密码',512))))))))));
不要直接通过密码或密码
Crypt_str.
,首先哈希。此文档的先前版本建议前方法,但不再推荐,因为这里显示10bet官方网站的示例更安全。如果
aes_decrypt()
检测无效数据或不正确的填充,返回空值
。但是,有可能aes_decrypt()
返回非空值
值(可能垃圾)如果输入数据或密钥无效。AES_ENCRYPT ()
和aes_decrypt()
允许控制块加密模式并取可选init_vector.
初始化向量参数:这
block_encryption_mode
系统变量控制基于块的加密算法的模式。它的默认值是AES-128-ECB
,它使用128位和ecb模式的键长表示加密。有关此变量的允许值的说明,请参阅第5.1.7节“服务器系统变量”。。可选
init_vector.
参数为需要它的块加密模式提供初始化向量。
对于需要可选的模式
init_vector.
参数,它必须是16个字节或更长(忽略超过16的字节)。如果发生错误init_vector.
不见了。对于不需要的模式
init_vector.
,它被忽略,如果指定了警告则会产生警告。可以通过呼叫来生成用于初始化向量的随机字节字节字符串
random_bytes(16)
。对于需要初始化向量的加密模式,必须使用相同的向量来加密和解密。mysql> set block_encryption_mode ='aes-256-cbc';mysql> set @key_str = sha2('我的秘密密码',512);mysql> set @init_vector = random_bytes(16);mysql> sect @crypt_str = aes_encrypt('text',@ key_str,@ init_vector);mysql>选择aes_decrypt(@ crypt_str,@ key_str,@ init_vector);+ --------------------------------------- + |aes_decrypt(@ crypt_str,@ key_str,@ init_vector)|+ --------------------------------------- + |文字|+ -----------------------------------------
下表列出了每种允许的块加密模式、支持该模式的SSL库以及是否需要初始化向量参数。
块加密模式 支持模式的SSL库 所需初始化矢量 欧洲央行 openssl,yassl. 不 加拿大广播公司 openssl,yassl. 是的 CFB1 openssl. 是的 CFB8 openssl. 是的 CFB128 openssl. 是的 OFB. openssl. 是的 使用的陈述
AES_ENCRYPT ()
或者aes_decrypt()
基于语句的复制不安全,无法存储在查询缓存中。压缩字符串并将结果返回为二进制字符串。此函数需要使用诸如的压缩库编译MySQL
zlib
。否则,返回值始终是空值
。压缩的字符串可以是未压缩的解压缩()
。MySQL>选择长度(压缩(重复('a',1000))));- > 21 mysql>选择长度(压缩(''));- > 0 mysql>选择长度(压缩('a'));- > 13 mysql>选择长度(压缩(重复('a',16)));- > 15.
压缩字符串内容以以下方式存储:
DECODE ()
解密加密的字符串Crypt_str.
使用pass_str.
作为密码。Crypt_str.
应该是返回的字符串编码()
。笔记这
编码()
和DECODE ()
函数在MySQL 5.7中弃用,不应再使用。期望他们在未来的MySQL发布中被删除。考虑使用AES_ENCRYPT ()
和aes_decrypt()
反而。des_decrypt(
Crypt_str.
(,key_str
])解密加密的字符串
des_encrypt()
。如果发生错误,则此函数返回空值
。仅当MySQL已配置SSL支持时,此函数才有效。看第6.3节“使用加密连接”。
如果不
key_str
参数给出,des_decrypt()
检查加密字符串的第一个字节,以确定用于加密原始字符串的des键编号,然后从des密钥文件中读取密钥以解密消息。为此工作,用户必须拥有超级
特权。可以使用该密钥文件指定--des-key-file
服务器选项。如果通过此功能a
key_str
参数,字符串用作解密消息的键。如果是
Crypt_str.
参数似乎不是加密字符串,MySQL返回给定的Crypt_str.
。笔记这
des_encrypt()
和des_decrypt()
函数在MySQL 5.7中弃用,在MySQL 8.0中删除,不应再使用。考虑使用AES_ENCRYPT ()
和aes_decrypt()
反而。des_encrypt(
str.
[, {key_num.
|key_str
}])使用Triple-DES算法使用给定密钥加密字符串。
仅当MySQL已配置SSL支持时,此函数才有效。看第6.3节“使用加密连接”。
基于第二个参数选择要使用的加密密钥
des_encrypt()
,如果给出了一个。没有参数,使用来自des键文件的第一个密钥。与A.key_num.
参数,使用来自des键文件的给定密钥编号(0到9)。与A.key_str
参数,给定的密钥字符串用于加密str.
。可以使用该密钥文件指定
--des-key-file
服务器选项。返回字符串是第一个字符的二进制字符串
CHAR (128 |
。如果发生错误,key_num.
)des_encrypt()
回报空值
。添加128以使其更容易识别加密密钥。如果您使用字符串键,
key_num.
是127。结果的字符串长度由此公式给出:
纽约=orig_len.+(8 - (orig_len.%8))+ 1
des键文件中的每一行都具有以下格式:
key_num.des_key_str.
每个
key_num.
值必须是范围内的数字0.
至9.
。文件中的行可以是任何顺序。des_key_str.
是用于加密消息的字符串。数字和键之间应该至少有一个空格。第一个键是如果未指定任何关键参数,则使用默认密钥des_encrypt()
。您可以告诉MySQL以从密钥文件中读取新密钥值
flush des_key_file.
陈述。这需要重新加载
特权。拥有一组默认键的一个好处是它为应用程序提供一种检查存在加密列值的方法,而无需给出最终用户解密这些值的权利。
笔记这
des_encrypt()
和des_decrypt()
函数在MySQL 5.7中弃用,在MySQL 8.0中删除,不应再使用。考虑使用AES_ENCRYPT ()
和aes_decrypt()
反而。mysql>从customer_table中选择customer_address> crypted_credit_card = des_encrypt('credit_card_number');
编码()
加密str.
使用pass_str.
作为密码。结果是与相同长度相同的二进制串str.
。解密结果,使用DECODE ()
。如果你仍然需要使用
编码()
,必须使用盐值以降低风险。例如:编码('cleartext',concat('my_random_salt','my_secret_password'))
必须在更新密码时使用新的随机盐值。
加密
str.
使用UNIX.Crypt()
系统调用并返回一个二进制字符串。这盐
参数必须是具有至少两个字符或结果的字符串空值
。如果不盐
参数给定,则使用一个随机值。mysql>选择加密('hello');- >'vxufajxvarroc'
加密()
忽略所有但前八个字符str.
,至少在某些系统上。这种行为是由底层的实现决定的Crypt()
系统调用。指某东西的用途
加密()
与之UCS2
那UTF16.
那UTF16LE.
, 或者UTF32.
不建议使用多字节字符集,因为系统调用需要以零字节结束的字符串。如果
Crypt()
您的系统上不可用(如Windows的情况,加密()
总是回报空值
。为字符串计算MD5 128位校验和。该值以32个十六进制数字或
空值
如果论点是空值
。例如,返回值可以用作哈希键。有关高效存储哈希值的本节开始,请参阅本节开始的注释。返回值是连接字符集中的字符串。
mysql >选择MD5(测试);——>“ae2b1fca515949e5d54fb22b8ed95575”
这是“RSA Data Security,Inc.MD5消息摘要算法。“
请参阅有关MD5算法的注意事项本节。
-
笔记
此函数在MySQL 5.7中已弃用,并在MySQL 8.0中删除。
返回从ClearText密码计算的哈希密码字符串
str.
。返回值是连接字符集中的字符串,或空值
如果参数是空值
。此函数是服务器使用的算法的SQL接口,用于加密MySQL密码以便存储mysql.user
授予表。这
old_passwords.
系统变量控制密码哈希方法使用密码()
函数。它还会影响密码散列创建用户
和授予
使用a指定密码的语句鉴定
条款。下表显示,对于每个密码散列方法,允许的值
old_passwords.
哪个身份验证插件使用散列方法。密码散列方法 old_passwords值 相关的身份验证插件 mysql 4.1本地哈希 0. mysql_native_password.
SHA-256哈希 2 SHA256_PASSWORD.
SHA-256密码散列(
old_passwords = 2
)使用随机盐值,这使得结果密码()
非法。因此,使用此功能的语句不对基于语句的复制不安全,并且无法存储在查询缓存中。加密由
密码()
是单向(不可逆转的),但它与UNIX密码不相同类型的加密类型。笔记密码()
身份验证系统在MySQL Server中使用;你应该不是在您自己的应用程序中使用它。为此目的,考虑更安全的功能,例如SHA2()
反而。还要看看RFC 2195,第2节(挑战 - 响应身份验证机制(CRAM)),有关在您的应用程序中安全地处理密码和身份验证的更多信息。警告在某些情况下,调用的陈述
密码()
可以在服务器日志中记录或在历史文件中的客户端上录制在诸如此类的历史记录文件中〜/ .mysql_history.
,这意味着可以通过读取访问该信息的任何人读取清除密码。有关服务器日志以及如何控制它的条件的信息,请参阅第6.1.2.3节,“密码和日志记录”。有关客户端日志记录的类似信息,请参阅第4.5.1.3节“MySQL客户端日志记录”。 此函数返回二进制字符串
Len.
使用SSL库的随机数生成器生成的随机字节。允许值为Len.
范围为1到1024.对于该范围之外的值,发生错误。RANDOM_BYTES ()
可用于提供初始化向量aes_decrypt()
和AES_ENCRYPT ()
职能。在那种情况下使用,Len.
必须至少为16.允许更大的值,但忽略超过16的字节。RANDOM_BYTES ()
生成随机值,这使其结果不确定。因此,使用此函数的语句是基于语句的复制不安全,并且无法存储在查询缓存中。如RFC 3174(安全散列算法)中所述,计算串的SHA-1 160位校验和。该值返回为40个十六进制数字的字符串,或
空值
如果论点是空值
。该函数的一个可能用途是作为散列键。有关高效存储哈希值的本节开始,请参阅本节开始的注释。沙()
是的代名词SHA1()
。返回值是连接字符集中的字符串。
mysql>选择sha1('abc');- >'A9993E364706816aba3e25717850c26c9cd0d89d'
计算SHA-2哈希函数系列(SHA-224,SHA-256,SHA-384和SHA-512)。第一个参数是要散列的明文字符串。第二个参数表示结果的所需比特长度,其值必须具有224,256,384,512或0(其等同于256)。如果是一个参数是
空值
或者哈希长度不是允许值之一,返回值是空值
。否则,函数结果是包含所需比特数的散列值。有关高效存储哈希值的本节开始,请参阅本节开始的注释。返回值是连接字符集中的字符串。
mysql>选择sha2('abc',224);- >''23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7E36C9DA7'
仅当MySQL已配置SSL支持时,此函数才有效。看第6.3节“使用加密连接”。
解压缩一个压缩的字符串
压缩()
函数。如果参数不是压缩值,则结果为空值
。此函数需要使用诸如的压缩库编译MySQLzlib
。否则,返回值始终是空值
。MySQL>选择“未解压缩(压缩(”任何字符串“));- >'任何字符串'mysql> select loclpress('任何字符串');- > null.
UNCOMPRESSED_LENGTH (
compressed_string
)返回在压缩之前所拥有的压缩字符串的长度。
mysql>选择解压缩_length(压缩(重复('a',30)));- > 30.
validate_password_strength(
str.
)给定代表明文密码的参数,此函数返回一个整数,以指示密码的强度。返回值范围从0(弱)到100(强)。
密码评估由
validate_password_strength()
由此完成validate_password.
插入。如果未安装该插件,则函数始终返回0.有关安装的信息validate_password.
, 看第6.4.3节“密码验证插件”。若要检查或配置影响密码测试的参数,请检查或设置系统变量validate_password.
。看第6.4.3.2节,“密码验证插件选项和变量”。密码受到越来越严格的测试,返回值反映了哪些测试满足,如下表所示。另外,如果是
validate_password_check_user_name
启用系统变量,并且密码与用户名匹配,validate_password_strength()
无论其他方式如何,返回0validate_password.
设置系统变量。密码测试 返回值 长度<4. 0. 长度≥4且< validate_password_length.
25. 符合政策1 ( 低
)50. 符合政策2 ( 中等的
)75. 满足政策3( 强的
)100.