3

我正在编写PHP用于安全加密通信的私人消息系统。

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

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

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

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

存储在 PHP Session 中并不是一个安全的解决方案,因为 PHP Sessions 仍然存储在服务器上并且可能被破坏。

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

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

提前致谢。

4

2 回答 2

1

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

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

于 2013-02-13T17:50:30.567 回答
0

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

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

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

于 2017-04-28T05:20:19.220 回答