在php会话中存储安全用户数据的最佳方式是什么


What is the best way to store secure user data in php sessions?

我正在PHP中编码一个私有消息系统,用于安全加密通信。

每次用户注册帐户时,我都会使用phpseclib创建一个新的RSA私钥,并使用用户的密码在AES中对其进行加密,密码将被安全地散列和加盐存储在数据库中。

每次用户使用密码登录时,他还应该解锁私钥并随时维护。

这个脚本显然只用于在SSL连接下运行。

问题是,我需要在用户的会话中维护私钥的非加密版本,以确保他能够读取每条消息并编写新消息,而无需在每次刷新页面时插入密码。

存储在PHP会话中不是一个安全的解决方案,因为PHP会话仍然存储在服务器上,并且可能会受到损害。

将其存储在Cookie中不是一个好的解决方案,因为Cookie很容易被盗(但通过这种方式,我将用户的命运掌握在他自己手中)。

ajax是否可以在PHP变量(而不是Session)中维护密钥,并且从不刷新页面,而是使用ajax获取和编写消息?还是有更好的解决方案?

提前谢谢。

假设您拥有完全的控制权,并且可以限制对数据库的访问/可见性,则可以将存储会话数据从文件存储转换为使用数据库作为会话存储。当然,这是假设您的数据库足够安全以满足您的需求。您可以在这里查看关于如何设置php以将会话存储到数据库的详细概述:http://www.stanford.edu/dept/its/communications/webservices/wiki/index.php/How_to_use_MySQL-based_sessions

假设您不需要在数据库重新启动时保留会话数据,您还可以将会话存储表的存储引擎设置为MEMORY,而不是Innodb或MyISAM。这将使它非常快速,并避免您可能担心的会话数据在磁盘上的数据库文件中处于未加密状态。

如果您将私钥存储在服务器上的任何位置,那么它的安全性取决于您对任何拥有该服务器root访问权限的人的信任。对于一个安全的消息系统,并非所有用户都希望信任可以访问root的人。(是吗?)这表明你想把私钥存储在用户的机器上。正如您所建议的,这样做是一组完全不同的安全问题。

我假设您的用户正在使用网络浏览器访问您的系统,因为您提到了cookie。大多数网络浏览器也支持本地存储(非cookie)的想法,可能是一个需要研究的选项;我不是这方面的专家,所以不做进一步的评论。

安全是困难和复杂的。警惕任何简单的答案,并意识到没有完美的安全。祝你好运