2012-09-08 46 views
3

这是一个软件工程问题,而不是编程问题。我试图让标题尽可能相关,如果有人觉得他们可以更恰当地说出来,请让我知道。从我自己的安全系统回收我自己

因此,我一直在开发使用异步的即时聊天Web服务。 JavaScript和PHP。应用程序背后的主要卖点是最大的保密性。有很多即时聊天应用程序,从Live Messenger,雅虎通,IRC和Skype等等。然而 - 叫我偏执狂 - 但我觉得我永远不会相信软件背后的公司,因为很少有控制权暴露给用户,而且大多数人似乎完全忽略了隐私问题。我知道还有很多其他安全/私密IM应用程序,但决定创建自己的应用程序,它使用SSL来加密所有使用点(用户 - >数据库 - >用户)之间的通信,消息内的传入/来源属性表是SHA256用盐进行散列,并且作为进一步的预防措施,一旦收件人收到(或要求我应该说)该邮件,邮件就会自动从数据库中删除。

此刻消息本身是纯文本。我可以使用PHP的各种加密库,但是我该如何做,这样可以消除我自己,所有者的潜力来解密消息,从而危害隐私?

我绝不会这样做,当然,我只想在这个范围内证明隐私。如果我用密码加密,我会知道密码。如果我使用编程密码进行加密,我会知道PHP将存储密码的位置。

有没有办法解决这个问题?或者这只是以信任而结束?据我所知PHP是无状态的,但会话例如强制服务器将数据存储在内存中,这可能是将密钥/密码存储在内存中的解决方案吗?

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

+2

您可以使用公钥加密,客户端软件将执行所有加密和解密操作。 – Mat

+0

客户端软件是浏览器?或者我的JS脚本? – Lee

回答

2

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

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

在您的计划中,公钥可以保存在您的服务器上并且由客户端请求。任何人都可以使用公钥。在仅有浏览器的环境中,存储私钥是一项挑战。它可以存储在本地存储中,但只能从该特定的计算机上使用。如果你允许它存储在你的服务器上,这样用户可以检索他们的私钥,不管他们在哪里,那么你回到了原来的问题(你必须相信服务器和服务器作者,他们不是自己不能访问私钥)。

有一个更复杂的算法,试图缓存公钥/私钥(可能在本地存储),但任何时候它不再可用(比如当用户切换计算机时),只需简单地硬币一个新的和在本地存储并使用新公钥更新目录。这样做的好处是您可以继续使用新计算机的系统,但缺点是您无法读取使用先前公钥加密的消息,除非您以某种方式拥有与该公钥对应的私钥。所以,这可以在即时消息传递的情况下工作,在这种情况下,消息永远不会保存在服务器上,但是如果服务器为您提供消息,并且您希望能够从任何位置读取消息,每个消息都有自己的消息密钥对。

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

+0

非常感谢。这是一些很好的信息。由于我的程序密钥加密的当前设计将不起作用,因为服务器是必需的。我可能并不清楚,我的聊天软件不应该依赖任何专业软件,只是浏览器本身允许最大的便携性。有些人推荐node.js和其他p2p平台,但这并不能解决目前的设计问题。它专为手机设计,所以应该只使用浏览器。我不确定为什么这个问题是关闭的,如果问到我可以详细阐述。 – Lee

1

您可以在客户端上执行加密。如果你想要最大限度的隐私,那么你不会信任服务器上的任何东西。如果消息和/或解密密钥从未击中服务器,那么即使您想要这样做,您本质上也不能读取该消息。

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

+0

此刻的设计意味着服务器被大量使用。这是一个简单的应用程序,它使用PHP来执行处理,JS实时推送/请求消息,以及一个SQL数据库来存储帐户和临时消息。我将如何在这个设计中实现这样一个系统?我无法想象有可能与PHP,尤其是JS进行p2p通信。 – Lee

+0

http://www.webrtc.org/包括P2P的东西... –

+1

@Lee是的,你可以,看看node.js – Kris