之前介绍过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写入前先做HEXHEX()可以将二进制转为十六进制, 如此就能顺利存到VARCHAR栏位
取出时先使用UNHEX()转回二进制, 再进行解密
如果你的资料不止英数, 会有中文字出现, 那可能取出时会变乱码
这时可以在最外层加CAST(), 转为CHAR, 并指定为UTF8格式。