目标:
我希望允许用户在自定义 Web 应用程序(支持托管环境中的 PHP/MySQL)中创建问题并从其他用户那里收集信息,并保护收集到的数据。
背景:
所有用户回答的默认问题都足够笼统,不能将其解释为个人身份信息 (PII),从而限制了我保护它的责任,但创建自己问题的用户可能会要求 PII,这将成为一种责任。
我想做的是以这样一种方式保护这些信息,即如果主机帐户或数据库遭到破坏(或两者兼有!),如果没有大量工作,PII 将无法恢复,即使那样,也只有一个一小部分理论上是可以收回的。
建议的解决方案:
假设 MySQL 的内置AES_ENCRYPT()/AES_DECRYPT()
函数用于加密 PII 表,则需要将密码存储在主机帐户中,因此如果主机帐户被盗,数据很容易被读取。
由于用户的密码受到很好的保护(用盐散列),我正在考虑在身份验证期间捕获他们的明文密码,对其进行加密,并将其存储在 PHP 会话中,直到用户注销。
将为每个用户创建一个公钥/私钥组合,私钥受用户密码 + salt 的密码保护。
然后,当基于该用户的自定义问题的 PII 数据添加到数据库时,用户的公钥将用于加密他们通过应用程序收集的 PII。当读取数据时(仅当用户登录时),数据将使用用户的私钥(使用密码+盐解锁)解密。
我看到的好处是:
- 在最坏的情况下,服务器完全受损,读取应用程序代码以查找加密密钥,解密 PHP 会话文件以查找用户密码,然后解密与该用户关联的 PII 表中的条目,然后仅从问题中收集 PII可以恢复当前登录的用户。任何未登录的用户都是安全的。
- 即使是 DBA 或类似人员也无法读取 PII。
我看到的缺点是:
- 用户密码在登录时以可恢复的形式存储。
- 忘记密码的用户将失去对其数据的访问权限。
- 由于加密,每个相对较小的数据位都会占用数据库中更多的空间。
我的问题:有没有更好的方法来做到这一点?