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