前几天被问数据库中的加密的方法,我根据我的理解作答之后被鄙视了,回来整理了一下资料,感觉我的回答并没有什么明显的漏洞。。 这里记录一下,作为一个基线,为以后的优化奠基。
数据在数据库中的加密,按照加密的数据的粒度可以分为:
1)字段和表级加密。 这两个都是数据库内部,通常是同一个用户的数据或者同一家公司的信息,在实现上,可能支持同样的KMS解决方案,所以这两个放一起。
2)数据库级加密。这个是一家用户对自己的数据库文件进行整体的加密的级别。
以上两个加密的方法都需要数据库本身的支持,尤其是字段和表级。在实现上可以由数据库供应商来实现,也可以由数据库供应商提供API,由用户自己提供加密库来实现,现在大部分的数据库都支持BYOK的模式了。再往下面的加密属于透明加密(对数据库用户可以保持透明),不需要数据本身的支持,但是需要操作系统层面的支持。
3)文件级加密。 对数据库文件进行加密。
4)磁盘加密。使用类似于bitlocker 这样的加密工具对整个磁盘或者SANS 进行加密。
从1到4, 粒度越来越大,安全性相对来说是越来越低的。但是,部署难度却是越来越低,同时效率越来越高。因为通常安全性和性能不能两全。 用户需要根据业务的需求选择一个安全性和效率相对平衡的方法来进行加密的管理。
除此之外,还有一层应用程序级别的加密,是指数据加密完全由应用程序来控制,在数据库的操作中完全进行密文操作,由应用程序控制加密算法和密钥管理。这个加密的方法已经不属于在数据库加密的范畴了,在此不做讨论。程序级加密也是有一定的弊端的,因为在数据库中存储的都是密文,所以无法进行字段检索,只能通过其他字段来完成检索,数据的直观性和效率无法得到体现。
下面来简单介绍每种加密方法的利弊
对于第一种,又有人根据加解密动作的在数据处理的环节,把此加密又分为 前置代理加密和后置代理加密,前置需要谨慎使用,对于性能影响很大,尤其是数据在内存中也是加密的状态的情况下。对于行式存储模式的数据库,每个查询动作都需要对某列的数据数据进行解密的操作,查询的效率急剧下降,需要谨慎使用。 后置稍微好一些,Oracle 可以通过“视图+触发器+扩展索引+外部方法调用”的方式实现部分字段级别的数据加密和解密,同时保证应用的完全透明。这个方法适用于特别敏感和重要的数据字段和表的加密。
第二种:数据库级别的加密, 使用的相对来说比较多了,解决方案的多样性和丰富度也比较友好, 甚至支持用户调用自己的加密算法,可以根据用户的权限进行加密的管理。
第三种: 文件系统的加密:
在操作系统中植入具有一定入侵性的“钩子”进程,在数据存储文件被打开的时候进行解密动作,在数据落地的时候执行加密动作,具备基础加解密能力的同时,能够根据操作系统用户或者访问文件的进程ID进行基本的访问权限控制。
第四种:
大多是通过专用的磁盘加密软件对磁盘内容进行加密,如Windows操作系统的BitLocker,这样加密方式可以防止盗取硬盘之后偷取数据, 也能防止对数据库文件进行复制。
后面慢慢把这些内容丰满起来。 同时引入了另外一个坑, 就是这么都是对称的加密, 密钥和密码的管理应该怎么来管理。 这个可以专门写一篇。