1,加密数据的查询
(1),基础查询
以加密电话号码为例,可以选择的方式:
-
第一种方式:在写sql语句的时候,通过自定义的解密函数实现对应的数据的解密,从而实现数据的比对。比如可以使用AES加密算法,但是注意在这个场景下:在where条件中运用了函数的运算解密操作,不会走索引;另外Innodb表的索引长度与单列的长度有关,如果是组合索引的话,则组合索引长度最大为:列数*255(
name1
(255),name2
(255),name3
(255)),其中对应单列索引长度最大为255。
-- 加密方法:value为需要加密的明文,当然也可以是表中某一列的名称,key为加密使用的密钥
AES_ENCRYPT(value,key)
-- 解密方法:value为需要解密的密文,可以为解密的密钥
AES_DECRYPT(value,key)
-
第二种方式:创建一个单独的列,用于保存电话号码明文,然后在电话号码的Hash列(通过MD5实现散列)上建立索引;在查询的时候,先将电话号码的明文计算hash值(MD5值),根据hash值(MD5值)去匹配到对应的行即可。
详细的步骤:- 添加Hash列:
person_hash
- 初始化Hash列数据:
update person set person_hash = md5(AES_DECRYPT(person_name_aes,"key"))
- 构建Hash列索引:
ALTER TABLE person ADD INDEX idx_person_name_hash (person_hash):
- 新增数据行;
- 添加Hash列:
(2),模糊查询
通过对密文数据进行分词组合,将分词组合的结果集分别进行加密,然后存储到扩展列,查询时通过key like '%partial%'
;但是,一般情况下要满足大于4位英文字符(半角),2个中文字符(全角),然后才可以做为一个检索条件。
wingyu2
使用4个字符为一组的加密方式,第一组wing
,第二组ingy
,第三组ngyu
,第四组gyu2
… 依次类推。
如果需要检索所有包含检索条件4个字符的数据比如:ingy
,对该字符串加密之后后通过 key like “%partial%”
查库。
我们都知道加密后长度会增长,增长的这部分长度存储就是我们要花费的额外成本,典型的使用成本来换取速度。
补充:
1,Hash散列算法
Hash散列算法可以通过类比人的指纹来理解,它可以是一个文件的“指纹”,那么我们就可以通过Hash散列算法去校验文件的可靠性。比如,我们在MySQL官网下载文件的时候,他会有提示该文件的hash值,我们可以在Linux系统中通过md5sum
这个命令来计算对应下载文件的hash值,如果相等则说明文件被完整下载了。
Hash散列算法的核心目标转换具有相同长度、不可逆的消息摘要。
对比其他的加密算法,是将目标文本转成具有不同长度的,可逆的密文。Hash算法严格上来说并不属于加密算法,而是与加密算法属于并列关系的一种算法。
通过hash加盐的方式可以一定程度上进一步的保证数据的安全性。
- salt可以简单的理解成:随机产生的一定长度的,可以和密码相结合,从而使hash算法产生不同结果的字符串。也就相当于你的新密码 = 旧密码 + 随机的盐值,然后对新密码进行hash。
- 优点:这种方法会极大防止受到彩虹表的攻击,因为即便攻击者构造出彩虹表,因为你使用了 hash(密码+ salt),攻击者彩虹表里的哈希值hash(密码)和你数据库中的哈希值是不同的
网友评论