【发布时间】:2011-11-06 12:09:50
【问题描述】:
目标:
我希望允许用户在自定义 Web 应用程序(支持托管环境中的 PHP/MySQL)中创建问题并从其他用户那里收集信息,并保护收集的数据。
背景:
所有用户回答的默认问题都足够笼统,不能被解释为个人身份信息 (PII),因此限制了我保护它的责任,但创建自己问题的用户可能会要求 PII责任。
我想做的是以这样一种方式保护这些信息,即如果主机帐户或数据库遭到破坏(或两者兼有!),如果没有大量工作,PII 将无法恢复,即便如此,理论上只有一小部分可以恢复。
建议的解决方案:
假设 MySQL 的内置 AES_ENCRYPT()/AES_DECRYPT() 函数用于加密 PII 表,则需要将密码存储在主机帐户中,因此如果主机帐户被盗,数据很容易被读取。
由于用户的密码得到了很好的保护(用盐散列),我正在考虑在身份验证期间捕获他们的明文密码,对其进行加密,并将其存储在 PHP 会话中,直到用户注销。
将为每个用户创建一个公钥/私钥组合,私钥受用户密码 + salt 的密码保护。
然后,当基于该用户的自定义问题的 PII 数据添加到数据库时,用户的公钥将用于加密他们通过应用收集的 PII。读取数据时(仅在用户登录时),数据将使用用户的私钥(使用密码+盐解锁)解密。
我看到的好处是:
- 在最坏的情况下,服务器完全受到攻击,读取应用程序代码以查找加密密钥,解密 PHP 会话文件以查找用户密码,然后解密与该用户关联的 PII 表中的条目,然后 只有从当前登录用户的问题中收集的 PII 可以恢复。任何未登录的用户都是安全的。
- 即使是 DBA 或类似人员也无法读取 PII。
我看到的缺点是:
- 用户密码在登录时以可恢复的形式存储。
- 忘记密码的用户将无法访问他们的数据。
- 由于加密,每个相对较小的数据位都会占用数据库中更多的空间。
我的问题:有更好的方法吗?
【问题讨论】:
-
一旦您的服务器受到威胁,几乎不可能确保得到保护。只要有人可以访问 php 代码,他就可以轻松地修改代码以在登录时将所有密码(或密钥对)写入明文文件。一旦知道盐(或知道它是如何构造的),哈希就不会被保存以进行保护。
-
是的,只要漏洞未被发现,就可以捕获密码。这个想法是遏制和最小化泄漏。至少一些数据仍会受到保护,因为希望能够很快发现违规行为,并且并非所有用户都会在该时间范围内登录。
-
您到底想在 PHP 会话中存储什么?如果您只在登录时解密私钥,我不明白为什么您需要在内存中添加额外的加密密钥。
-
需要将密码存储在 PHP 会话中,因为私钥将受到密码保护,并且每次从数据库中提取 PII 时都需要对其进行解密和使用。无需仅仅因为用户登录就提取所有 PII 并解密。用户只能查看在任何给定会话期间存储的 PII 的一小部分。
标签: mysql security encryption pii