技术分享 | 详解SQL加密函数:AES_ENCRYPT()
发布网友
发布时间:2024-10-01 19:37
我来回答
共1个回答
热心网友
时间:2024-11-26 03:25
作者:岳明强,爱可生北京分公司DBA团队成员,人称强哥,负责数据库管理平台的运维和MySQL问题处理。擅长对MySQL的故障定位。本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
由于客户对MySQL数据加密有特定需求,作者近期对MySQL数据加密进行了深入研究。目前,MySQL原生的数据加密包括静态加密和SQL级别加密。静态加密是对数据库物理文件进行加密,防止直接拖库读取敏感数据;SQL级别加密则只加密部分字段,即使获取到数据也无法解读。本文将主要介绍SQL加密函数AES_ENCRYPT()。
解密函数为AES_DECRYPT(crypt_str,key_str[,init_vector][,kdf_name][,salt][,info | iterations]),加密函数为AES_ENCRYPT(str,key_str[,init_vector][,kdf_name][,salt][,info | iterations])。其中,str为加密后的字符串,crypt_str为加密的字符串,key_str为加密密钥,不建议使用明文密钥,应先用hash处理。init_vector为初始向量,用于块加密模式,默认的加密模式为aes-128-ecb,不需要初始向量。kdf_name、salt、info、iterations为KDF的相关参数,官方建议使用,但由于版本要求过高,这里暂不考虑。
使用AES_ENCRYPT()解密数据时,默认使用128-bit,也可使用196或256-bit。密钥的长度与性能和安全度有关。使用AES_ENCRYPT()对基于statement的binlog类型是不安全的,建议使用SSL连接,防止将加密函数的密码和其它敏感值作为明文发送到服务器。
示例:经过加密和压缩的结果返回二进制字符,建议配置为VARBINARY或BLOB二进制字符串数据类型的列,防止字符集转换从而导致插入失败。为了避免插入失败,也可以将值转换为16进制,然后再进行存储。查看时,需先用unhex解析出来,再进行解密。
加密函数为MySQL原生的加密手段,可以加密身份证、银行卡等隐秘信息。在业务中批量使用会造成一定的性能损耗,个人建议这些复杂的函数操作还是在应用层实现,以降低数据库的压力。