likes
comments
collection
share

【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列

作者站长头像
站长
· 阅读数 6

MySQL的加解密及压缩函数

许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有VARBINARY或BLOB二进制字符串数据类型的列。这避免了删除尾随空格或转换字符集可能改变数据值的潜在问题,例如使用非二进制字符串数据类型(CHAR、VARCHAR、TEXT)时可能发生的问题。

MySQL加解密函数

MySQL自带的加解密函数主要有以下: 【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列 一些加密函数返回 ASCII 字符字符串:MD5()、PASSWORD()、SHA()、SHA1()、SHA2()。它们的返回值为具有由character_set_connection和collation_connection系统确定的字符集和排序规则的字符串 变量。这是一个非二进制字符串,除非字符集为 。

如果应用程序存储来自返回十六进制字符串的函数(如 MD5() 或 SHA1() 的值) 数字,可以通过以下方式获得更有效的存储和比较 使用 UNHEX() 将十六进制表示形式转换为二进制,并将结果存储在 BINARY(N) 列中。

将十六进制字符串存储在 CHAR 列中的大小损失至少为两倍, 如果值存储在使用该字符集的列中,则最多 4 次(其中每个字符使用 <> 字节)。存储字符串也会导致比较速度变慢 因为值较大且需要采用字符集 将排序规则考虑在内。


ENCODE()、DECODE()

已在5.7.2版本弃用,目前仍可用,但将在后续版本中删除。

DES_ENCRYPT()、DES_DECRYPT()

AES_ENCRYPT()加密与AES_DECRYPT()解密

AES高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

AES_ENCRYPT和AES_DECRYPT在MySQL中是进行加密了,如果你需要对MySQL某些字段进行加解密的话,使用MySQL的加解密函数可能比程序中处理更方便.

  • AES_ENCRYPT(‘密码’,‘钥匙’)
  • AES_DECRYPT(表的字段名字,‘钥匙’)

这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用

严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB

函数参数(MySQL版本小于等于5.7.6)

  • AES_ENCRYPT(str,key_str),其中str为待加密字符串,key_str为秘钥

  • AES_DECRYPT(crypt_str,key_str),其中crypt_str为已加密的二进制串,key_str为秘钥

已在5.7.6版本弃用,目前仍可用,但将在后续版本中删除。

AES_ENCRYPT()、AES_DECRYPT()

推荐使用这对加解密函数。aes_encrypt()和aes_decrypt()使用官方的aes(高级加密标准)算法(以前称为“rijndael”)实现数据的加密和解密。

加密后的二进制串长度可以通过下面公式计算:

16 * (trunc(string_length / 16) + 1)

函数参数(MySQL版本大于等于5.7.6)

函数参数

  • AES_ENCRYPT(str,key_str[,init_vector]),其中str为待加密字符串,key_str为秘钥,其中init_vector根据选择不同的块加密模式为可选项

  • AES_DECRYPT(crypt_str,key_str[,init_vector]),其中crypt_str为已加密的二进制串,key_str为秘钥,其中init_vector根据选择不同的块加密模式为可选项

st和key_str参数可以是任何长度,init_vector参数不得小于16个字符。可以通过block_encryption_mode参数,控制块加密模式,默认值为:aes-128-ecb。可配置的形式为:aes-keylen–mode。

  • keylen可配置为128, 192, 256

  • mode可配置为ECB, CBC, CFB1, CFB8, CFB128, OFB。

下表展示了不同mode是否需要init_vector参数。 【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列 默认的ECB模式不需要init_vector参数,用法与5.7.4以前相同。

修改块加密模式:

set block_encryption_mode='aes-256-cbc';

查看对应的加解密模式

show variables like 'block%;

block_encryption_mode

此变量控制的块加密模式,基于块的算法,例如 AES。它会影响 AES_ENCRYPT() 和 AES_DECRYPT() 的加密。

block_encryption_mode需要格式中的值,其中 Keylen是关键位和模式的长度为加密模式。该值不区分大小写。允许的键值为 128、192 和 256. 允许的加密模式取决于 MySQL 是否 使用 OpenSSL 或 yaSSL 编译:aes-keylen-mode。 【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列 例如,此语句会导致 AES 加密 使用 256 位密钥长度和 CBC 模式的函数:

SET block_encryption_mode = 'aes-256-cbc';

尝试将block_encryption_mode设置为包含不受支持的密钥长度或模式的值不支持SSL库。

AES_ENCRYPT(str,key_str[,init_vector][,kdf_name][,salt][,info | iterations])

AES_ENCRYPT加密 字符串 str 使用键字符串 key_str,并返回二进制文件 包含加密输出的字符串。AES_DECRYPT() 使用密钥字符串key_str解密加密字符串crypt_str,并返回原始 纯文本字符串。如果任一函数参数为 ,则该函数返回 。如果 AES_DECRYPT检测到无效 数据或填充不正确,它将返回 . 但是,AES_DECRYPT() 有可能 返回非值(可能是垃圾) 如果输入数据或键无效。NULLNULLNULLNULL

使用AES_DECRYPT()的语句对于基于语句的复制。

AES_DECRYPT(crypt_str,key_str[,init_vector][,kdf_name][,salt][,info | iterations])

AES_ENCRYPT() 和 AES_DECRYPT() 允许控制 块加密模式。block_encryption_mode系统 变量控制基于块的加密模式 算法。其默认值为 ,表示加密 使用 128 位的密钥长度和 ECB 模式。有关说明 此变量的允许值,请参见第 5.1.7 节 “服务器系统变量”。这 可选init_vector参数为 用于为块加密提供初始化向量 需要它的模式。aes-128-ecb