3

这更像是一个软件工程问题,而不是编程问题。我试图使标题尽可能相关,如果有人觉得他们可以更恰当地用词,请告诉我。

所以,我一直在开发一个使用异步的即时聊天网络服务。javascript和PHP。该应用程序背后的主要卖点是高度保密。有许多即时聊天应用程序,从 Live Messenger、Yahoo Messenger、IRC 和 Skype 等等。但是 - 称我为偏执狂 - 但我觉得我永远无法信任软件背后的公司,因为用户几乎没有控制权,而且大多数人似乎完全忽略了隐私问题。我知道还有许多其他安全/私人 IM 应用程序,但决定创建我自己的,它使用 SSL 加密所有使用点(用户->数据库->用户)之间的通信,

目前,消息本身是纯文本。我可以使用 PHP 的各种加密库,但我将如何以消除我自己(所有者)解密消息从而损害隐私的可能性的方式这样做?

我当然不会这样做,我只是想在这种程度上证明隐私。如果我用密码加密,我会知道密码。如果我要使用编程密码进行加密,我会知道 PHP 将密码存储在哪里。

有没有办法解决这个问题?或者这只是以信任结束?

更新:据我所知 PHP 是无状态的,但是会话例如强制服务器将数据存储在内存中,这是否可以将密钥/密码存储在内存中?

感谢您的任何想法或建议。

4

2 回答 2

2

解决此类问题的典型方法是使用公钥加密。您可以在此处阅读概览:http ://en.wikipedia.org/wiki/Public-key_cryptography 。

简而言之,每个用户都会获得一个公钥/私钥组合。公钥是公开的,因此您可以获得任何人的公钥。私钥仅由其所属的用户保存。公钥密码学的关键是允许人们使用公钥加密某些东西,但只能使用私钥对其进行解密的数学。因此,您可以获得某人的公钥,加密发往他们的消息,并且他们是唯一可以用他们的私钥解密的人。

在您的方案中,公钥可以保存在您的服务器上并由客户端请求。任何人都可以使用公钥。在仅浏览器的环境中,存储私钥是一项挑战。它可以存储在本地存储中,但只能在该特定计算机上使用。如果您允许将其存储在您的服务器上,以便用户无论身在何处都可以检索他们的私钥,那么您将回到最初遇到的相同问题(您必须信任服务器和服务器作者,他们是'不自己访问私钥)。

有一种更复杂的算法会尝试缓存公钥/私钥(可能在本地存储中),但只要它不再可用(例如用户切换计算机时),您只需创建一个新的并将其存储在本地和使用新的公钥更新目录。这样做的好处是您可以继续从新计算机上使用系统,但缺点是您将无法读取使用先前公钥加密的消息,除非您以某种方式拥有与该公钥对应的私钥。因此,这可能适用于实时即时消息传递方案,其中消息永远不会为您保存在服务器上,但如果服务器为您保存消息并且您希望能够从任何位置读取它们,每个位置都有自己的密钥对。

SSL 通过使用动态生成的公钥/私钥对解决了这个问题,但是它们是在直接的端到端连接中协商和交换的(因此中间没有节点可以查看或存储未加密的数据),所以另一种可能性将是使用点对点游戏技术(它有自己的缺点,可能仅在浏览器中不可能)创建点对点连接并在该连接上使用 SSL 来交换安全凭证(在查看您和您的服务器)或直接交换消息。您的服务器将用于促进两个端点的连接和传达这种愿望,但不用于交换安全信息。

于 2012-09-08T15:21:56.217 回答
1

您可以在客户端上进行加密。如果您想要最大程度的隐私,那么您不信任服务器上的任何东西。如果消息和/或解密密钥从未到达服务器,那么即使您很想这样做,您也基本上无法阅读该消息。

当然,现在你遇到了一个新问题——如何在不涉及服务器的情况下在两个或多个客户端之间交换解密密钥。

于 2012-09-08T13:09:32.093 回答