MySQL AES 256 加密与解密

之前介绍过MD5加密, 有以下两种方式

Java MD5

MySQL MD5

但MD5属于不可逆, 我们仍有些资料需要能被解密

例如: 电话, 电子邮件, 住址...等等可被修改的个资

这时候就可以用AES 256来做加解密, 以下我们用Email栏位来做示範

首先把加解密方法做成Function, 要使用时就可直接呼叫

新增encrypt_email_function

CREATE FUNCTION `encrypt_email_function`(email VARCHAR(100)) RETURNS varchar(100) CHARSET utf8BEGINSET block_encryption_mode = 'aes-256-cbc';SET @key_str = SHA2('MySecretKey', 512);SET @init_vector = '1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f';RETURN CONVERT(HEX(AES_ENCRYPT(email, @key_str, @init_vector)), CHAR CHARACTER SET utf8);END

新增decrypt_email_function

CREATE FUNCTION `decrypt_email_function`(email VARCHAR(100)) RETURNS varchar(100) CHARSET utf8BEGINSET block_encryption_mode = 'aes-256-cbc';SET @key_str = SHA2('MySecretKey', 512);SET @init_vector = '1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f';RETURN CAST(AES_DECRYPT(UNHEX(email), @key_str, @init_vector) AS CHAR CHARACTER SET utf8);END

block_encryption_mode: 加密的方式

key_str: 加密所使用的key, 官方建议使用SHA2做杂凑, 因为SHA1已在2017年被Google攻破

init_vector: 初始向量, 官方文件上注明must be 16 bytes or longer

加密跟解密必须用同一组key跟vector, 若其中一组不一样, 则会解不出来。

例: 将init_vector换成RANDOM_BYTES(16), 会发现每次的向量都不同, 而不同向量是解不开的。

我们在加密时会HEX, 解密时会UNHEX

这是因为AES_ENCRYPT与AES_DECRYPT加解密完回来的格式是二进制

二进制直接存到VARCHAR栏位, 写入时会有warning, 虽然能写入但实际上取出时会出错

解法有两种

将栏位型别改为以下其中一种binary / varbinary / blob写入前先做HEX

HEX()可以将二进制转为十六进制, 如此就能顺利存到VARCHAR栏位

取出时先使用UNHEX()转回二进制, 再进行解密

如果你的资料不止英数, 会有中文字出现, 那可能取出时会变乱码

这时可以在最外层加CAST(), 转为CHAR, 并指定为UTF8格式。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章