在不将解密密钥以明文形式存储在服务器上的情况下,对公共云服务器磁盘上的敏感数据进行加密和解密的最合适方法是什么?
要求
在我们的 SaaS 网络/移动应用程序中,用户登录后可以将包含敏感客户数据的 PDF 文件上传到由第三方提供商(例如 Amazon/Rackspace)物理托管的公共云服务器。我想通过在将数据写入磁盘之前对其进行加密来保护磁盘上的数据,并在从磁盘读取数据时对其进行解密。
一个常见的解决方案是使用对称加密,例如 AES,并将解密密钥存储在服务器的文件系统中。我想避免将明文解密密钥与数据一起存储,以保护对磁盘上数据的访问,无论它最终位于第 3 方的基础架构中 - 例如可能跨多个物理服务器和磁盘(服务器磁盘,在每日图像备份磁盘上未加密)数组)等。
条件:用户应该能够下载他们之前上传的 PDF。管理员用户应该能够查看任何用户上传的 PDF。
我正在考虑使用用户的登录密码来保护解密密钥。
潜在的解决方案
在每个用户注册期间,一个 RSA 公钥/私钥对将由服务器磁盘生成并存储在服务器磁盘上。私钥将存储为使用用户密码加密的 AES(实际上是基于用户密码的 PBKDF2 派生密钥)。
加密:
- 纯文本 PDF 上传到服务器(通过 SSL)
- 服务器为 AES 加密生成一个随机字符串 (R)。
- RSA 使用用户的公钥加密 R。RSA 使用管理员用户的公钥加密 R。# 允许管理员用户解密任何使用 R 和 AES 加密的 PDF
- 将这三个加密部分存储到文件系统中。
解密:
- 使用用户的登录密码解密用户的私钥(通过 PBKDF2)
- RSA 使用用户的私钥解密 R。
- AES 使用 R 解密 PDF 并将其返回给用户
这样,如果有人可以完全访问完整的文件系统数据,他们就无法解密 PDF 文件,除非他们也知道密码。
问:这是一个安全的解决方案吗?你看到其中的缺陷了吗?我应该考虑是否有合适的替代方案?