我手头有一个有趣的加密问题。我不知道它是否可以解决,但这里是:
数据库将包含敏感的用户信息。因此,必须对用户信息进行加密(双向加密)。用户有一个登录名/密码,这些可以用于双向加密。现在,加密的设计方式是,即使是查看数据库表的管理员也无法理解用户信息。
但是,设计必须考虑到用户可能忘记密码的情况。如果密码用于加密,忘记密码意味着信息丢失 - 不需要。如果用户密码本身使用双路算法(而不是单路哈希)存储在数据库中,并且在脚本中硬编码了一个 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/