文章

ShadowedChat

ShadowedChat

实现了一个浏览器上的端到端加密的聊天。目标是极致的匿名、以及数据安全。
部署在了https://chat.bdfz.chat
https://github.com/CyanTachyon/Shadowed开源了源码。

如何使用?

  • 打开,先注册,输入用户密码完成注册。注意,请务必保存好你的账号密码,由于这种数据安全性的设计,只要你密码丢了,那就绝对找不回来,我也没辙。
  • 账号密码登录
  • 点击头像,可以切换主题、设置头像、退出登录
  • 询问一下你想聊天的人的用户名(不区分大小写)点击左边栏右上角的加号,添加好友,输入对方的用户名完成添加,就可以发消息了
  • 点击加号也可以拉群
  • 我的用户名是Cyan欢迎来加我:)

安全性说明

服务器会记录什么个人信息?

ip地址会不可避免的被记录,除此之外,没了。

我的信息都可能被什么人看到?

  1. 对于一般用户:可以通过直接输入别人的用户id获得别人的头像。
  2. 若可以查看服务器的数据:可以得知所有用户的用户名、头像,所有群聊的标题、群主、成员。每一条消息的发送者,发送内容。但所有消息的内容都无法被获得。
  3. 若可以修改服务器的数据:可以让指定的人无法登录、修改别人的用户名、修改聊天的名字等,但仍无法查看到任何一条聊天信息,也无法登录别人账号用别人的身份发消息、拉别人入群等

总的来说,用户名、聊天名这种,我觉得也不算非常隐私的内容,基本上是最坏情况下有泄露风险。但所有聊天内容,都是加密的,理论上只会在你的浏览器上完成解密,没有其他手段获得聊天内容。

如何证明我没骗你?

如何证明我所说属实,没有开源一版部署另一版?

  • js代码未经过混淆或其他处理,f12你就能看到前端所有逻辑,哪些数据传给了后端,可以很方便的确认。
  • 你可以对一下你的公钥和对方收到的你的公钥,如果相同,证明服务器没有进行中间人攻击。

我觉得这两条应该就差不多够了。

实现方式

  • 注册:当每个用户注册的时候,在前端随机生成一对公私钥。用你的密码作为对称加密的秘钥对私钥加密。同时从服务器获得一个单向加密的秘钥对密码加密。将你的用户名单向加密后的密码公钥(明文)私钥(用密码对称加密)发送到服务器,服务器会对单向加密后的密码再进行一次加盐慢hash。
  • 登录:你输入密码,从服务器获得与之前相同的单向加密的秘钥对密码加密,发送到后端,后端会验证是否与之前的密码匹配,若不匹配登录失败,若匹配:返回公钥(明文)私钥(用密码对称加密),前端使用密码对私钥(用密码对称加密)进行解密,重新获得私钥

以上流程确保了公私钥不会因为丢失导致丢号,同时又避免服务器获得公私钥。

  • 发起聊天(群聊、私聊相同):发起聊起者,在前端随机生成一个对称加密秘钥,对所有你想邀请参与群聊的人,包括你自己,分别用对应的他们的公钥加密这个对称加密秘钥。加密后的对称加密秘钥将保存在服务器。所有聊天都会用这个对称加密秘钥加密再发送给服务器。因为私钥仅能在前端复原,所以服务器全程无法获得对称加密秘钥

简单来说,在聊天过程中,使用端到端的非对称加密实现对称加密秘钥的交换,而后通过将所有消息经由这个对称加密秘钥加密、解密实现聊天。

本文由作者按照 CC BY-NC 4.0 进行授权, 未经许可不得转载。