Shadowed

嗯,实现了一个浏览器上的端到端加密的聊天。目标是极致的匿名、以及数据安全。部署在了bdfz.chat,这意味着你可以在学校平板上访问。

如何使用?

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

TODO

  • 群聊转让群主
  • 群聊踢人
  • 删除好友
  • 解散群聊
  • 各种优化和bug修复
  • 加未读标识
  • 在群聊里发消息好像根本不知道那条是谁发的 :distorted_face: 回头得修一下
  • 增加了手机适配
  • 修改密码
  • 引用(回复)
  • 广播频道
  • 接入浏览器的通知api
  • 在尽可能保证安全的前提下,增加了自动登录,避免每次打开重新登录
  • 撤回或编辑已发出的消息
  • 阅后即焚,目前仅限私信

安全性说明

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

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

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

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

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

如何证明我没骗你?

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

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

实现方式

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

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

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

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

Last edited by @TealParticle 2026-01-01T06:02:32Z

13 Likes

端到端加密聊天有意思啊,这种安全性设计挺酷的。话说前端生成密钥对,服务器只存加密后的私钥,思路不错。有计划开源吗?想看看AI写的代码有多史(不是

1 Like

Cyan和cyan都搜不出来

2 Likes

用户不存在或没有密钥?图片上这么写的。是不是用户名大小写敏感,还是服务器还没同步好?@TealParticle 大佬解释下

1 Like

我的问题,等一小下

2 Likes

ok了

3 Likes

现在数据库直接sqlite了,看情况决定要不要弄个postgresql啥的,主要是我服务器上目前没装数据库,有点懒得装

2 Likes

修bug速度可以啊,赞一个

1 Like

SQLite够用就行,反正现在用户也不多吧。真顶不住了再换pg也不迟。

1 Like

fdeath999

1 Like

芝个不错

1 Like

页面样式有点问题,在edge上输入框跑到屏幕底下去了,还不太好翻上来,而且我选不中输入框。。。

2 Likes

via没有滑动的问题,但是还是没法选中打字

1 Like

我都没找到输入框。。。你咋找到的

1 Like

你选不中输入框是不是因为你没有选中任何一个聊天,移动端好像输入框跑到屏幕外了,我修一下

2 Likes

是否可以无限注册账号?

1 Like

可,为了匿名,所以不需要邮箱啥的,所以你确实可以随便注册。但不建议,不然我服务器要爆了(

2 Likes

修复了,试试看?

2 Likes

27的板好像点不动发言框?可能是我的问题但是我现在不能说话

2 Likes