ShardingSphere
约 633 字大约 2 分钟
2025-10-12
自互联网诞生之初,网络完全的是永远绕不过去的话题。对于数据在网络传输的安全的,通常分为两个方向,数据本身安全或数据传输通道安全。例如:常规的数据加密就是数据本身安全,采用HTTPS协议来传输就数据传输通道安全。
数据的加密存储
在数据库中,当需要保护的列被加密后存储在数据库中时,传统的查询方式将不再适用了。
例如,用户的手机号码为:13344445555,在经过Bcrypt算法加密之后结果为$2a$10$bbmU44ZmpPd1whdIA5Kgpuh2NUGClVG9tFw8MedqHK6z81A.xW7my。那么此时,我们想通过like %133%作为条件来查询的时候,普通的查询方式就很难办到了。
如果非要查询的话,就需要通过应用层来操作,但是得Bcrypt加密后的算法的是无法解密成明文的,所以能实现只有精确查询,无法实现模糊查询。
为了应对这种场景,对于加密后的数据需要进行查询的,通常分为以下几种:
- 精确查询
- 应用层加载整个表到内存中,解密所有的加密列,在内存中进行精确匹配;
- 使用确定性加密算法(相同的明文加密的结果相同),查询时先加密查询条件,再在数据库中进行匹配;
- 模糊查询
- 保留部分明文前缀用于模糊匹配;
- 将可能用到的查询字段都进行加密 ,然后再查询索引表中查询到真实数据的主键;
- 使用支持同态解密的算法,可直接在加密数据上执行某些运算;
- 范围查询
- 加密后保持数值的顺序,可以直接使用<、>、Between等操作符;
- 将数值范围分段加密,查询时确定分段范围,解密该范围内所有的数据后在应用层进行过滤
所以其实针对这种场景的做法很多,真正要采取哪种方式来做都需要根据真实的业务场景来制定对应的方案,同时加密也不可避免的带来了性能上的损耗,越复杂的算法安全的程度越高但是性能上的损耗也就越大,所以对于方案的选择需要综合考虑各个方面的影响因素。