ShadowedChat
ShadowedChat
实现了一个浏览器上的端到端加密的聊天。目标是极致的匿名、以及数据安全。
部署在了https://chat.bdfz.chat。
在https://github.com/CyanTachyon/Shadowed开源了源码。
如何使用?
- 打开,先注册,输入用户密码完成注册。注意,请务必保存好你的账号密码,由于这种数据安全性的设计,只要你密码丢了,那就绝对找不回来,我也没辙。
- 账号密码登录
- 点击头像,可以切换主题、设置头像、退出登录
- 询问一下你想聊天的人的用户名(不区分大小写)点击左边栏右上角的加号,添加好友,输入对方的用户名完成添加,就可以发消息了
- 点击加号也可以拉群
- 我的用户名是
Cyan欢迎来加我:)
安全性说明
服务器会记录什么个人信息?
ip地址会不可避免的被记录,除此之外,没了。
我的信息都可能被什么人看到?
- 对于一般用户:可以通过直接输入别人的用户id获得别人的头像。
- 若可以查看服务器的数据:可以得知所有用户的用户名、头像,所有群聊的标题、群主、成员。每一条消息的发送者,发送内容。但所有消息的内容都无法被获得。
- 若可以修改服务器的数据:可以让指定的人无法登录、修改别人的用户名、修改聊天的名字等,但仍无法查看到任何一条聊天信息,也无法登录别人账号用别人的身份发消息、拉别人入群等
总的来说,用户名、聊天名这种,我觉得也不算非常隐私的内容,基本上是最坏情况下有泄露风险。但所有聊天内容,都是加密的,理论上只会在你的浏览器上完成解密,没有其他手段获得聊天内容。
如何证明我没骗你?
如何证明我所说属实,没有开源一版部署另一版?
- js代码未经过混淆或其他处理,f12你就能看到前端所有逻辑,哪些数据传给了后端,可以很方便的确认。
- 你可以对一下你的公钥和对方收到的你的公钥,如果相同,证明服务器没有进行中间人攻击。
我觉得这两条应该就差不多够了。
实现方式
- 注册:当每个用户注册的时候,在前端随机生成一对公私钥。用你的密码作为对称加密的秘钥对私钥加密。同时从服务器获得一个
单向加密的秘钥对密码加密。将你的用户名、单向加密后的密码、公钥(明文)、私钥(用密码对称加密)发送到服务器,服务器会对单向加密后的密码再进行一次加盐慢hash。 - 登录:你输入密码,从服务器获得与之前相同的
单向加密的秘钥对密码加密,发送到后端,后端会验证是否与之前的密码匹配,若不匹配登录失败,若匹配:返回公钥(明文)、私钥(用密码对称加密),前端使用密码对私钥(用密码对称加密)进行解密,重新获得私钥。
以上流程确保了公私钥不会因为丢失导致丢号,同时又避免服务器获得公私钥。
- 发起聊天(群聊、私聊相同):发起聊起者,在前端随机生成一个
对称加密秘钥,对所有你想邀请参与群聊的人,包括你自己,分别用对应的他们的公钥加密这个对称加密秘钥。加密后的对称加密秘钥将保存在服务器。所有聊天都会用这个对称加密秘钥加密再发送给服务器。因为私钥仅能在前端复原,所以服务器全程无法获得对称加密秘钥
简单来说,在聊天过程中,使用端到端的非对称加密实现对称加密秘钥的交换,而后通过将所有消息经由这个对称加密秘钥加密、解密实现聊天。
本文由作者按照 CC BY-NC 4.0 进行授权, 未经许可不得转载。