我有一些使用 MySQL 访问构建基于 PHP 的网站的经验,存储加密的用户详细信息,但所有其他字段都是纯文本。我最近的项目需要将敏感数据存储在数据库中。
我想建立一个系统,用户可以访问他自己的条目并查看纯文本结果,但即使他能够访问其他人的条目,它们也会被加密,难以理解的字符串。
我对如何实现这一点有一个想法,但也许它不是最优的,或者已经存在工具可以以更有效的方式做到这一点。
1.) 将用户名存储为纯文本,密码使用 sha1() 或更好的散列算法加上随机盐等进行散列。
2.) 获取用户的密码(不是散列的密码,而是他输入的密码)并使用它定义一个特定于该用户名和密码的密钥,然后将其存储为会话变量。由于密钥永远不会存储在除了用户的头部之外的任何地方(以他知道他的纯文本密码的形式,然后将通过将其与他的用户名和一些盐,散列等混合,以某种方式将其转换为密钥,因为他输入它登录)这应该是一个很好的解决方案吧?
3.) 使用该密钥加密或解密该用户的所有数据。
在我看来,即使有人访问了数据库并看到了纯文本用户名和加密密码的列表,他们也无法找出特定的密钥,因为它没有存储在任何地方。因此,即使获得访问权限,他们也无法破译敏感数据库字段的内容。当然,无论如何我都在设法阻止他们访问数据库,但作为一个包罗万象的努力,这似乎是一组很好的步骤。
请专家对此发表评论,并提供一些建议吗?非常感谢。
我在programmers.SE论坛上发布了这个,他们告诉我这是一个更好的问题位置。更具体地说,为什么我不应该自己这样做。如果是这样,那么有什么替代方案?