美文网首页
自定义开发-加密数据查询

自定义开发-加密数据查询

作者: CoderInsight | 来源:发表于2022-10-28 15:18 被阅读0次

    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):
      • 新增数据行;

    (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(密码)和你数据库中的哈希值是不同的

    参考连接

    相关文章

      网友评论

          本文标题:自定义开发-加密数据查询

          本文链接:https://www.haomeiwen.com/subject/zshftdtx.html