mysql – 通过使用与用户自己的密码保护的私钥配对的公钥加密来保护Web应用程序数据库中的PII?

目标:

我想允许用户在自定义Web应用程序(支持托管环境中的PHP / MySQL)中创建问题并从其他用户收集信息,并保护收集的数据.

背景:

所有用户回答的默认问题都是一般性的,不能被视为个人身份信息(PII),从而限制了我保护它的责任,但是创建自己问题的用户可能会要求PII,然后这些PII成为一种责任.

我想要做的是保护这些信息,如果托管帐户或数据库被泄露(或两者兼而有之!),如果没有大量的工作,PII将无法恢复,即便如此,只有从理论上讲,小部分是可以恢复的.

建议的解决方案:

假设MySQL的内置AES_ENCRYPT()/ AES_DECRYPT()函数用于加密PII表,密码需要存储在主机帐户中,因此如果托管帐户被泄露,则可以轻松读取数据.

由于用户的密码受到良好保护(使用盐进行哈希处理),我正在考虑在身份验证期间捕获明文密码,对其进行加密,并将其存储在PHP会话中,直到用户注销为止.

将为每个用户创建一个公钥/私钥组合,其中私钥由用户的密码盐密码保护.

然后,当基于该用户的自定义问题的PII数据被添加到DB时,用户的公钥将用于加密他们通过应用程序收集的PII.读取数据时(仅当用户登录时),数据将使用用户的私钥(使用密码盐解锁)进行解密.

我看到的好处是:

>在最糟糕的情况下,服务器完全泄露,读取应用程序代码以查找加密密钥,解密PHP会话文件以查找用户密码,然后解密与该用户关联的PII表中的条目,然后仅收集从中收集的PII可以恢复当前登录用户的问题.任何未登录的用户都是安全的.
>即使是DBA或类似的人也无法阅读PII.

我看到的缺点是:

>用户密码在登录时以可恢复的形式存储.
>忘记密码的用户将无法访问其数据.
>由于加密,每个相对较小的数据位将在数据库中占用更多空间.

我的问题:有更好的方法吗?

最佳答案
从安全角度来看,我看到了这个设计的一些问题.首先必须永远不加密密码,这是CWE-257标识的漏洞.

更多MySQL的AES_ENCRYPT()完全是垃圾,原因不止一个.它使用EBC模式,这是一个很好的例子,为什么这是废话:

原始图片:

EBC模式(这是mysql的AES_ENCRYPT()使用的):

但是如果攻击者受到攻击的数据库将通过启用query log来击败AES_ENCRYPT().

应该避免使用用户的密码进行加密,你应该使用crypgoraphic nonce.如果您使用密码,请确保使用String2Key功能.您还必须使用带有random iv的CBC或CMAC模式.我真的不知道非对称加密可以如何帮助.非对称加密非常缓慢,内存密集.当攻击者控制消息时,它们保护的数据会降低安全性,因为您可以比较密文消息.这就是随机IV is important的原因,并且在不对称的世界中你没有这种级别的保护.

密钥生成应该类似于:
$键= string2key($base_nonce.$盐.$USER_PASSWORD)

确保string2key函数的输出与键空间的大小相同.所以aes 128需要128位密钥.每个密码都应该有自己的$salt,而$base是存储在textfile中的加密nonce. (攻击者必须先读取此文件,然后才能破解密钥,如果此值大到128位,那么它就是一个有争议的点.)每条消息都需要自己的$iv,这个值也必须是加密的nonce(类似于盐).我会从/ dev / urandom生成$salt,$iv和$base_nonce. IV可以以明文形式存储在数据库的列中,也可以与密文一起存储.

从法律角度来看,即使您构建了一个安全的cryptogrpahic系统,您仍然会遇到内部威胁问题,如果服务器完全受损,所有数据仍然会受到损害.这确实不是一个工程问题.

对法律威胁的最佳防御是由熟练的律师撰写的强有力的条款和条件.

转载注明原文:mysql – 通过使用与用户自己的密码保护的私钥配对的公钥加密来保护Web应用程序数据库中的PII? - 代码日志