实现MySQL AES_ENCRYPT函数带盐 - 对字段值做加密处理
  FDpwo5yIejAq 2023年11月02日 35 0

在MySQL中,AES_ENCRYPT函数本身不包含盐的功能。

盐(salt)是一个随机生成的值,用于增加加密的复杂性和安全性。在使用盐时,需要确保每次加密都使用不同的盐值,并将盐值与加密后的数据一起存储。解密时,需要将盐值与加密后的数据一起使用,以正确还原原始数据。

使用带盐的AES_ENCRYPT函数,加密具体步骤如下:

  1. 生成一个随机的盐值。盐值应该足够长、足够复杂,以增加破解的难度。
  2. 将盐值和密钥连接起来,形成新的字符串数据。
  3. 使用新的字符串数据作为密钥,对待加密的明文数据进行加密。
  4. 将加密结果和盐值一起存储到数据库中,以备后续的验证和解密使用。

使用带盐的AES_DECRYPT函数,解密具体步骤如下:

  1. 获取保存的盐值和加密结果。
  2. 将盐值和保存的密钥连接起来,形成新的字符串数据。
  3. 使用新的字符串数据作为密钥,对加密结果进行解密,可以使用AES_DECRYPT等解密算法。
  4. 比较解密后的结果与原始明文数据是否一致,从而判断验证或解密是否成功。


测试用例:

SET @salt = UUID();
SET @key = CONVERT(CONCAT(@salt, 'MyKey1234567890') USING utf8);
SET @encrypted_data = (SELECT AES_ENCRYPT('中国', @key));
SELECT @encrypted_data AS '【加密后的数据】';
SELECT CONVERT(AES_DECRYPT(@encrypted_data, @key) USING utf8) AS '【解密后的数据】';

对于加密数据,选择每次使用不同的随机盐值,这样即使相同的明文数据被多次加密,每次生成的密文也是不同的。这种方法称为“每次随机盐”。


生产示例:

在加密数据表中添加一个字段用于存储盐值,然后在解密时从该字段中获取盐值。具体的代码示例如下:

-- 加密数据表结构示例

CREATE TABLE encrypted_data (
    id INT PRIMARY KEY AUTO_INCREMENT,
    encrypted_text VARBINARY(255),
    salt VARCHAR(255)
);


-- 存储加密数据并使用随机盐

SET @salt = UUID();
SET @key = CONCAT(@salt, 'MyKey1234567890');
INSERT INTO encrypted_data (encrypted_text, salt)
VALUES (AES_ENCRYPT('贺春旸', @key), @salt);


-- 解密数据时获取盐值并转换为UTF-8编码

SELECT CONVERT(AES_DECRYPT(encrypted_text, CONCAT(salt, 'MyKey1234567890')) USING utf8) AS decrypted_data
FROM encrypted_data;


以上示例代码中,我们创建了一个名为encrypted_data的表,其中包含了encrypted_text用于存储加密后的数据,以及salt用于存储盐值。在插入数据时,我们使用了UUID()函数生成一个随机盐,并将其与密钥连接后进行加密。在解密时,我们通过将存储的盐值与密钥连接来恢复出原始数据。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   2024年04月26日   43   0   0 split数组字符串
  xaeiTka4h8LY   2024年05月17日   42   0   0 字符串
FDpwo5yIejAq