这更像是一个软件工程问题,而不是编程问题。我试图让标题尽可能相关,如果有人觉得他们可以更恰当地说出来,请告诉我。
所以,我一直在使用asynch开发即时聊天网络服务。 javascript和PHP。该申请背后的主要卖点是绝对保密。有许多即时聊天应用程序,从Live Messenger,Yahoo Messenger,IRC和Skype,仅举几例。然而 - 叫我偏执 - 但我觉得我永远不会相信软件背后的公司因为很少有人接触到用户,而且大多数人似乎完全忽视了隐私问题。我知道还有很多其他安全/私有IM应用程序,但决定创建我自己的应用程序,它使用SSL来加密所有使用点(用户 - >数据库 - >用户)之间的通信,来自/的属性消息表是SHA256用盐进行哈希处理,并且一旦收件人收到(或请求我说)消息,就会自动从数据库中删除消息。
目前,邮件本身都是纯文本。我可以使用PHP的各种加密库,但是如何以一种方式消除我自己,所有者解密消息从而破坏隐私的可能性呢?
我当然不会这样做,我只想在这个程度上证明隐私。如果我用密码加密,我会知道密码。如果我使用程序密码加密,我会知道PHP将存储密码的位置。
有没有办法解决这个问题?或者这只是以信任结束?
更新:据我所知,PHP是无状态的,但会话例如强制服务器将数据存储在内存中,这可能是将密钥/密码存储在内存中的解决方案存储器?
感谢您的任何想法或建议。
答案 0 :(得分:2)
解决此类问题的典型方法是使用公钥加密。您可以在此处阅读概述:http://en.wikipedia.org/wiki/Public-key_cryptography。
简而言之,每个用户都会获得一个公钥/私钥组合。公钥是公开的,因此您可以获得任何人的公钥。私钥仅由其所属的用户保留。公钥加密的关键是数学允许用户使用公钥加密某些内容,但只能使用私钥对其进行解密。因此,您可以获取某人的公钥,加密发往他们的消息,并且他们是唯一可以使用其私钥解密的消息。
在您的方案中,公钥可以保存在您的服务器上并由客户端请求。公钥可供任何人使用。在仅浏览器环境中,存储私钥是一项挑战。它可以存储在本地存储中,但只能从该特定计算机中使用。如果你允许它存储在你的服务器上,这样用户就可以检索他们的私钥,无论他们在哪里,你都会回到原来的同样问题(你必须相信服务器和服务器作者,他们不是不要自己访问私钥。
有一个更复杂的算法试图缓存公钥/私钥(可能在本地存储中),但任何时候它都不再可用(比如用户切换计算机时),你只需要新建一个并存储一个在本地,并使用新的公钥更新目录。这样做的好处是,您可以继续从新计算机使用该系统,但缺点是您将无法读取使用先前公钥加密的消息,除非您以某种方式拥有与该公钥对应的私钥。因此,这可以在实时即时消息方案中工作,其中消息永远不会保存在服务器上,但如果服务器为您保存消息并且您希望能够从任何位置读取消息,每个消息都有自己的消息。密钥对。
SSL通过使用动态生成的公钥/私钥对解决了这个问题,但它们是在直接的端到端连接中协商和交换的(因此中间没有节点可以查看或存储未加密的数据)所以另一种可能性是使用点对点游戏技术(它有自己的疣,可能在浏览器中不可能)来创建点对点连接,并通过该连接使用SSL来交换安全凭证(在您和您的服务器视图之外)或直接交换消息。您的服务器将用于促进两个端点连接和通信,但不用于交换安全信息。
答案 1 :(得分:1)
您可以在客户端上进行加密。如果您想要最大程度的隐私,那么您就不相信服务器上的任何内容。如果消息和/或解密密钥从未到达服务器,那么即使您很想这样做,您也基本上无法阅读该消息。
当然,现在你遇到了一个新问题 - 如何在不涉及服务器的情况下在两个或多个客户端之间交换解密密钥。