2

考虑任何聊天应用程序,例如 gtalk、whatsapp。我的问题与如何完成这些的服务器端实现有关。场景是:
客户端 A 想通过聊天服务器 S 与客户端 B 交谈。当实现通信时,我假设 S 上运行着 NAT(网络地址转换)服务器,双方通过该服务器向 S 标识自己。
之后此时,S 或在 S 上运行的任何聊天服务器充当 A 和 B 之间的中介。当 A 发送“Hi B,你好吗?”时,这句话肯定是要发送给 S,然后 S 会发送给 A .

我的第一个问题来了:客户端和服务器之间的通信,是加密的吗?我知道数据将根据 TCP/IP 通信堆栈进行打包,并且该数据包的数据部分将包含发送的实际文本 A。但是这个数据部分,是不是被加密保护了?意思是,如果有人在哪里嗅探数据包并提取数据,他们能弄清楚 A 发送给 B 的内容吗?
我问的原因:如果我要制作一个聊天应用程序,我如何保护我的用户的隐私不受陌生人甚至我自己的影响(因为 A 发送的内容对我的服务器代码是可见的,我不妨将它写到文件;谁知道,谷歌可能会这样做:P)。

现在假设 B 离线,那么 S 将不得不延迟向 B 发送消息,直到 B 在线并请求存储的消息。或者在这一点上,考虑像 dropbox 这样的应用程序临时存储文件。

第二个问题:S如何存储这个消息或文件?加密是如何完成的?简而言之,如果我要制作这样的产品,我怎么能向用户保证他们的数据在我们的服务器上是安全和私密的,即使我或我的公司也无法读取它,即使我们愿意。

总而言之,公共领域网站如何设法保持其用户数据的私密性和对陌生人及其自身的安全?

感谢您的建议!

4

1 回答 1

4

我假设 1:1 通信(换句话说,Alice 和 Bob 有私人通信)——群聊很棘手。

看看OTR。基本上,您需要端到端加密,并且聊天客户端需要能够自动与其他用户交换密钥并帮助用户确定他是否信任密钥(例如,使用允许两个用户相互确认的社会主义百万富翁协议身份使用有关共享秘密的问题。因此,服务器不需要任何特殊代码 - 它只是转发或存储加密数据而不接触它。但是,客户端需要相当多的代码:

  • 当两个用户第一次交谈时,客户端需要能够自动交换公钥。
  • 客户端需要能够存储其他用户的公钥,以便他们在某人的密钥更改时注意到。
  • 客户端需要能够协助用户确认其他用户的身份(例如使用社会主义百万富翁协议或通过电话交换公钥指纹)并存储和永久显示有关此信任的信息(例如作为小型“已验证”用户名旁边的图标)。
  • 客户端需要能够使用在第一次联系时交换的密钥来加密/解密签名/验证来自其他对等方的消息。

当然,为了让用户相信他们的客户真的按照你说的做,你需要公开你的源代码,或者至少让一些独立的人来审查它

于 2013-03-31T16:28:18.963 回答