一个聊天应用程序的服务器端实现


Server side implementation of a chat application

考虑任何聊天应用程序,如gtalk, whatsapp。我的问题与服务器端如何实现这些功能有关。的场景是:
客户想跟客户B,通过一个聊天服务器S通信实现时,我认为有NAT(网络地址转换)服务器上运行,由双方确定自己S
在这一点上,或者聊天服务器运行在年代,A和B之间充当中介,当发送"嗨,你好吗?",这句话必须要年代,和S将寄给A .

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

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

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

总而言之,一个公共领域的网站如何设法保持其用户数据的私密性和安全性,不受陌生人和自己的影响?

谢谢你的建议!

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

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

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

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