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

时间:2013-02-13 17:35:45

标签: php

我正在PHP编码私人消息系统,以进行安全的加密通信。

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

每次用户使用他的密码登录时,他也应该解锁他的私钥并在运行中进行维护。

此脚本显然只能在SSL连接下运行。

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

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

将它存储在Cookie中并不是一个好的解决方案,因为Cookie很容易被盗(但这样我就把用户的命运掌握在自己手中)。

是否可以使用ajax将密钥保存在PHP变量(而不是Session)中,并且永远不会刷新页面,而是使用ajax获取和写入消息?还是有更好的解决方案?

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

假设您不需要在重新启动数据库时保留会话数据,您还可以将会话存储表的存储引擎设置为MEMORY而不是Innodb或MyISAM。这将使它非常活泼并避免您在未加密状态下对磁盘上的db文件内的会话数据的关注。

答案 1 :(得分:0)

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

我假设您的用户使用网络浏览器访问您的系统,因为您提到了Cookie。大多数Web浏览器也支持本地存储(非cookie)的概念,可能是一个可供调查的选项;我在该领域根本不是专家,所以不会进一步评论。

安全性很难,也很复杂。警惕任何简单的答案,并注意没有安全是完美的。祝你好运。