php - 两种方式的数据库加密甚至对管理员都是安全的

标签 php mysql encryption

我手头有一个有趣的加密问题。我不知道它是否可以解决,但这里是:

数据库将包含敏感的用户信息。因此,必须对用户信息进行加密(双向加密)。用户有一个登录名/密码,这些可以用于双向加密。现在,加密的设计方式是,即使是查看数据库表的管理员也无法理解用户信息。

但是,设计必须考虑到用户可能忘记密码的情况。如果密码用于加密,忘记密码意味着信息丢失 - 不需要。如果用户密码本身使用双路算法(而不是单路哈希)存储在数据库中,并且在脚本中硬编码了一个 key ,那么管理员可以通过查看脚本来发现硬编码的 key (管理员当然可以访问到脚本)。

有人知道解决办法吗?

PS:这是一个真正的问题。我的公司是一个绝对的安全狂热者(ISO 27001 和所有),我被委托(delegate)设计一个具有上述功能的系统。顺便说一句,我正在使用 PHP 脚本和 MySQL。

编辑:可能之前并不清楚,用户需要每天查看/编辑此用户信息。

最佳答案

您需要的是恢复代理。对所有数据加密两次:一次使用用户 key ,一次使用恢复代理(公共(public)) key ;至少后一个需要是不对称的。使用正式的访问协议(protocol)(例如四眼原则)将恢复代理 key 保存在物理保险箱中。通常,管理员无法访问加密数据,但如果用户丢失了 key ,并且授权恢复,则可以获得恢复 key 。

还有一些方法可以加密恢复代理的 key ,以便 n 人中有 m 人必须同意使用它。

编辑:一种实现策略是对所有内容进行两次加密。或者,对于需要独立恢复的每个数据集,创建一个新的对称 key ,并只对该 key 加密两次;原始数据仅使用 session key 加密。这种方法可以扩展到多个独立的读者;它需要每个读取器的非对称 key (以便您可以使用所有读取器的公钥加密 session key - 一个是恢复代理)。

我从 Microsoft 的 Encrypting File System 中复制了术语,已实现该计划。

关于php - 两种方式的数据库加密甚至对管理员都是安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1192485/

相关文章:

php - mysqli_stmt 从 3 个表获取有限数据

php - 查询期间与 MySQL 服务器失去连接在 codeigniter 查询中,实时站点

php - 使用 php <?> explode 错误

php - 加入另一个包含标签的表

Python 不返回任何 MySQL 结果

javascript - Meteor 中的加密

php - 如何在某些页面上强制使用 HTTPS? (PHP)

php - 如果表中的行数小于限制,则返回行数 - 1

java - Android - 实现加密 IM 的最佳方式

php - AES 256 带 PKCS7/PKCS5 填充 GST 电子发票