客户希望数据库中的所有数据都加密,如何高效查询字段加密?

The customer wants all data encrypted in database, how to make efficient queries fields are encrypted?

如今,一些非技术客户询问是否所有数据 都以加密形式存储(和传输)。他们不喜欢只对密码进行哈希处理的想法。

最佳做法是什么,例如如果所有数据都被加密,如何进行高效的 SQL 查询?
如何查询例如部分搜索的用户名/JOHN/,如果所有字段都被加密?根据最终用户的需要对每个字段进行加密会导致可用性问题、缓慢和 cpu 成本,95% 的数据字段不是敏感数据。

或者是否足以假设:

数据库和后端运行在同一服务器,客户端html5。 如果后端 php 源代码具有访问位于同一硬盘上的 sql 数据库的加密密钥,它真的会提供一些额外的安全性吗?

另一种方式是 100% 安全;假设我们将登录名+密码组合设为某种唯一的加密密钥,但如果客户忘记密码,我们就会遇到严重的问题,根本无法访问他们的数据库列。

"Data is encrypted at rest" 是常见的安全要求。这通常意味着 - 正如您所指出的那样 - 在文件系统上加密。大多数 DBMS 都支持此功能。 另一方面,将数据作为加密值写入数据库表通常需要:

  • 在这个级别加密和解密是资源廉价的(它不是)
  • 您可以继续查询加密数据,无需进一步操作 (你不能)
  • 自定义实现(维护成本高,容易暴露)
  • 您的实施没有公开加密密钥 - 这 需要将其存储在异地

一个合理的中间立场可能是加密他们关心的任何敏感数据。这样做的好处是:

  • 当数据库或其基础数据从文件系统复制时 在未加密的形式下,敏感数据仍然是加密的
  • 数据库安全漏洞(例如数据库用户名和 密码)不一定会导致敏感数据泄露

总的来说,显式加密数据库中的数据有好处,但性能和维护成本也不容忽视。