Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 双向数据库加密即使从管理员那里也是安全的_Php_Mysql_Encryption - Fatal编程技术网

Php 双向数据库加密即使从管理员那里也是安全的

Php 双向数据库加密即使从管理员那里也是安全的,php,mysql,encryption,Php,Mysql,Encryption,我手头有一个有趣的加密问题。我不知道这个问题是否能解决,但下面是: 数据库应包含敏感的用户信息。因此,必须对用户信息进行加密(双向加密)。用户有一个登录名/密码,可用于双向加密。现在,加密的设计方式是,即使是查看数据库表的管理员也不能理解用户信息 然而,设计必须考虑用户可能忘记密码的情况。如果密码用于加密,忘记密码意味着信息丢失——这是不需要的。如果使用双向算法(而不是单向散列)将用户密码本身存储在数据库中,并在脚本中硬编码密钥,则管理员可以通过查看脚本来发现硬编码密钥(管理员当然可以访问脚本)

我手头有一个有趣的加密问题。我不知道这个问题是否能解决,但下面是:

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

然而,设计必须考虑用户可能忘记密码的情况。如果密码用于加密,忘记密码意味着信息丢失——这是不需要的。如果使用双向算法(而不是单向散列)将用户密码本身存储在数据库中,并在脚本中硬编码密钥,则管理员可以通过查看脚本来发现硬编码密钥(管理员当然可以访问脚本)

有人知道怎么解决这个问题吗

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

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

无法完成

在所有情况下,必须有人能够重新创建密钥来解密它。让我们考虑一下选项:

  • 密钥存储在服务器上。失败:管理员具有访问权限
  • 使用用户密码加密的密钥。失败:用户可能会忘记它

  • 解决方案是放松管理员的访问限制,而不是不可能,你只是让它变得非常困难。例如,如果数据使用一个使用用户密码加密的密钥进行加密,但该密钥托管在其他系统中,管理员在正常事件过程中无法访问该密钥(可能只有其他管理员可以访问?),那么您仍然可以从忘记密码的用户中恢复(有权访问托管密钥的人进行干预),但管理员不能下载数据库并读取所有数据。

    您需要的是恢复代理。对所有数据加密两次:一次使用用户密钥,一次使用恢复代理(公共)密钥;至少后一个密钥需要是不对称的。请使用正式的访问协议(如四眼原则)将恢复代理密钥保存在pyhsical安全中。通常,管理员无法访问加密数据,但如果用户丢失密钥,且恢复已获授权,则会获得恢复密钥

    还有一些方法可以对恢复代理的密钥进行加密,这样n人中有m人必须同意使用它

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


    我抄袭了微软的术语,微软实施了这一方案。

    但像银行等极端安全的系统就是这样工作的吗?我问这个问题是因为我相信其他人肯定会破解这个问题,银行似乎是一个强有力的候选者。银行等使用硬件安全模块进行加密我同意,这是正确的一个捉鬼者场景。将密钥管理器与网关守卫分离,将控制用户帐户密码的人与控制用户数据的人分离,这样你就可以避免将坏员工作为单一故障点。这很好,因为替代方案是完全质子反转。你能提供一些参考吗我可以进一步阅读的链接?此外,对所有内容进行两次加密是否意味着用户自己无法检索/编辑用户信息?如果我理解正确,Martin建议在数据库中存储用户数据两次-一次使用用户密钥加密,一次使用恢复代理密钥加密。@Crimson:请参阅我的编辑ser仍然可以检索信息。修改信息时,用户将再次需要使用恢复代理的公钥加密新数据。非常好。但是,一个问题可能是大小(h/w[cpu]和存储[db])因为这种方法虽然优雅,但有争议~将存储要求和处理能力提高了一倍。问题:您的数据加密必须有多强?数据混淆会不会(意味着数据不会以明文形式存储,但人们只需稍加努力就可以解密)够了,还是你想要一个真正强大的加密方案?真正强大的加密-没有发现数据的可能性!好吧,如果你不希望数据可以解密,但同时需要能够向用户显示解密的数据…我的公司不希望数据被发现(由于意外或恶意用户)。当然,数据必须被解密。用户是否能够恢复其以前的密码?或者生成一个新密码并向他们发送新密码,并在他们首次使用新密钥时强制他们替换密码是否安全?如果没有这一功能,这可以很容易完成。有了该功能,您可能必须使用非数字解决方案Lowis案提出了类似于“边缘”的观点。