我手头有一个有趣的加密问题。我不知道它是否可以解决,但这里有:
数据库包含敏感的用户信息。因此,必须加密用户信息(双向加密)。用户具有登录/密码,这些可用于双向加密。现在,加密的设计方式使得即使是查看数据库表的管理员也不应该理解用户信息。
但是,设计必须处理用户可能忘记密码的情况。如果密码用于加密,忘记密码意味着信息丢失 - 不想要。如果用户密码本身使用双向算法(而不是单向散列)存储在数据库中,并且在脚本中使用硬编码的密钥,则管理员可以通过查看脚本来发现硬编码密钥(管理员当然可以访问到剧本)。
有没有人知道如何解决这个问题?
PS:这是一个真正的问题。我的公司是一个绝对的安全狂热者(ISO 27001和所有),我受委托设计一个具有上述功能的系统。顺便说一句,我使用的是PHP脚本和MySQL。
编辑:可能之前不清楚,用户需要每天查看/编辑此用户信息。
答案 0 :(得分:16)
您想要的是恢复代理。加密所有数据两次:一次使用用户密钥,一次使用恢复代理(公共)密钥;至少后者需要是不对称的。使用正式的访问协议(例如,四眼原则)将恢复代理密钥保存在pyhsical safe中。通常,管理员无法访问加密数据,但如果用户丢失密钥并且授权恢复,则会获得恢复密钥。
还有一些方法可以加密恢复代理的密钥,以便m-out-of-n人必须同意使用它。
编辑:一种实施策略是将所有内容加密两次。或者,对于需要独立恢复的每个数据集,创建一个新的对称密钥,并仅加密该密钥两次;原始数据仅使用会话密钥加密。这种方法可以扩展到多个独立的读者;它需要每个阅读器的非对称密钥(这样您就可以使用所有阅读器的公钥加密会话密钥 - 一个是恢复代理)。
我从Microsoft的Encrypting File System复制了术语,该术语实现了该计划。
答案 1 :(得分:1)
无法完成。
在所有情况下,某人必须能够重新创建密钥才能解密它。让我们考虑一下选项:
解决方案是放宽具有访问限制的管理员,而不是不可能,你只是非常困难。例如,如果使用用用户密码加密存储的密钥对数据进行加密,但该密钥是在管理员在正常事件过程中无法访问的其他系统中托管的(可能只有另一个管理员可以访问? )然后你仍然可以从忘记密码的用户那里恢复(干扰谁有权访问托管密钥),但管理员不能只下载你的数据库并读取所有数据。