linux version: Centos7.3 

Mysql vrsion: mysql5.6.34

参考文档:

最近两天,接到业务上一个需求,需要对表中的部分字段(比如手机号,email)进行加密,在查看mysql的相关资料后,发现需要对数据库中的部分字段加密,基本就只能从业务层面的角度来实现。大概提供了如下几个加密函数。

经过测试后,写下自己对这些加密函数的一点认知。

PASSWORD():创建一个经过加密的密码字符串,适合于插入到MySQL的安全系统。该加密过程不可逆,和unix密码加密过程使用不同的算法。主要用于MySQL的认证系统。
ENCRYPT(,)  AES_DECRYPT( , ):使用UNIX crypt()系统加密字符串,ENCRYPT()函数接收要加密的字符串和(可选的)用于加密过程的salt(一个可以唯一确定口令的字符串,就像钥匙一样)。加密程度比ENCODE较强。注意,windows上不支持。
ENCODE(,)   DECODE(,):加密解密字符串。该函数有两个参数:被加密或解密的字符串和作为加密或解密基础的密钥。Encode结果是一个二进制字符串,以BLOB类型存储。加密成度相对比较弱。
MD5():计算字符串的MD5校验和(128位),SHA5():计算字符串的SHA5校验和(160位),这两个函数返回的校验和是16进制的,适合与认证系统中使用的口令。

对于文章中提到的4种方法,都进行了基本的测试。但是发现mysql的字段加密功能做得确实很一般。

经过测试,主要说说这些函数的缺点吧。

MD5,PASSWORD, SHA:  加密过程不可逆,就是数据经过加密后,无法正常解析出来。

ENCRYPT,AES_DECRYPT, ENCODE:需要把字段设置成blob,也就是文本字段,需要存储太长。曾经把这种方法对应的字段设置成varchar(1000)的长度,但是发现数据存储后,在解析的过程中无法正常解析出来。

根据上述的这些条件,需要对mysql的字段加密码,要么就是加密过程太复杂,要么就是存储太长。而且结合mysql对于函数的查询,并不会走索引,对于大数据量的查询,更不适用。所以目前的这些方法都不适合字段级别的加密。

所以最后的处理方案可能需要通过表级别或者视图的方案进行解决。