狼窝:另一个(端到端)加密聊天的聊天室

2015-03-01 08:04:31 +08:00
 NeoAtlantis

嗯,这是我写的一个端到端的加密聊天网站。名称来自Wolfschanze(狼窝)(我不是纳粹!)

先放地址

地址: https://neoatlantis.info/wolfschanze
另一个说明: http://neoatlantis.org/chat.html
源码地址: https://github.com/neoatlantis/wolfschanze

简介

有时候和几个人聊着聊着,发现有些内容不适合企鹅(你懂的),于是需要临时寻找一种更安全的通信方法。GnuPG是很好的(斯诺登都说好!),也可以配合Windows下的psi或者Linux下的Gajim使用,可惜不是所有的朋友都会用。这时候临时安装也不现实,于是需要一种简单的方案。

于是就出现了这个网站:端到端加密,思想类似GPG(但是库是我自己写的,稍后再说),进入页面首先拿到一个带着#号的网址,之后把这个网址发送给朋友,就能加入聊天。

每个人进入之后都会被程序自动生成一个临时的公钥,这个公钥公布到服务器上。由于我们不太能相信服务器,程序提供“指纹”功能,可以通过线下的电话、微信等语音方式核对所有人的公钥。

在核对完所有人的公钥之后,可以“启用安全模式”,这样可以保证突然闯进来的新成员不会偷偷看到正在进行的聊天。

其他的碎碎念

网页和服务器的通信是通过socket.io完成的,所以网页可以托管在一些比较可靠的服务器上(比如github pages)。这样可以保证网页上的代码不被篡改。socket服务器的作用主要是组织聊天室和负责公布公钥。

以后如果我能更熟悉WebRTC的开发,就可以改用网页内置的语音/视频功能直接进行公钥的确认了。

此外,我对前端的开发没什么经验,虽然知道AngularJS这样的东西应该会很好用,但是还是没放进我的程序,弄得代码各种麻烦。这个以后也是修改的方向……

关于我的加密库

很早之前我就在折腾的一个加密库neoatlantis-crypto-js,提供散列函数、对称加密、不对称加密算法和一些(很多)类似GPG(但是不兼容)的实现。本网站用到的是类似GPG的公钥的“身份公钥”的功能,一个私钥经过推导产生基于curve25519加密用的的私钥和公钥,经过另一种推导产生基于ECDSA的用于签名的私钥和公钥。对称加密用Salsa20/20和ChaCha20/20的复合体。

加密库的代码在 https://github.com/neoatlantis/neoatlantis-crypto-js ,尚不完善。但是能用了(比如这个网站)。

这个加密库并不打算用来处理很大量的数据(太慢)。我是打算用它搞一个独立的硬件设备(类似U盾,但是能加密解密各种消息等等)。不过这方面的进展还是很慢。于是就先弄了个副产品出来。

10886 次点击
所在节点    分享创造
24 条回复
won
2015-03-01 08:46:29 +08:00
不错,之前在用bitchat
swordfeng
2015-03-01 09:40:35 +08:00
不错
签名也可以ed25519试试,ecdsa请不要使用pist系曲线
如果可以存储和使用本地证书更好
独立硬件写驱动挺麻烦。。。
前端什么的。。。找人合作呀
NeoAtlantis
2015-03-01 09:54:44 +08:00
@swordfeng 目前聊天里面程序发送的消息进行了签名,不过解密之后没验证(如果验证就要解决验证不通过的问题,我还是懒(摊手,明明就是多几行代码的事情)……此外我不知道聊天里面用数字签名是不是好方案(参考OTR的作者的论述)

ed25519没找到js的实现……其实要不是看上椭圆曲线那种短小的签名,我打算以后可能在硬件里面用Merkle签名算法呢(不过这算法要大量的散列计算,至少要用C实现才实用)。现在能找到的网上各种库的ECDSA多数都是那个MIT的叫Tom Wu写的,真是天下代码一大抄……

证书的东西下一步也许会考虑。目前希望设计的是牺牲一点严谨的安全性,但是让人能尽快进入聊天。
也许可以做个比如在聊天时,有时间了就存下自己的证书和对方的指纹(不是证书,我的体系里面指纹是直接从证书导出的),记录信任关系。以后见到同样的指纹了就标记可信。
Bubing
2015-03-01 10:46:22 +08:00
其实信息泄露不一定在服务器上 输入法已经收集你的关键词信息了 企鹅等等 监控输入法是最最基本的了
swordfeng
2015-03-01 10:58:50 +08:00
@NeoAtlantis 唔。。。签名消息会有什么问题吗……求参考链接
安全设计一开始就要做,防止后期出现问题
存指纹吧。。。不过在网页上有点麻烦
Brk
2015-03-01 11:14:32 +08:00
github上没写安装说明阿
subpo
2015-03-01 11:32:14 +08:00
开放交友功能吧,约炮神器
sycsycsyc378
2015-03-01 13:51:49 +08:00
名称少了个s
fuxkcsdn
2015-03-01 15:10:01 +08:00
Windows 8.1 x64 IE11 卡在
正在连接到服务器,请稍候...

FF正常
arathos
2015-03-01 15:46:09 +08:00
指纹为什么都是不一样的 id一样
NeoAtlantis
2015-03-01 18:17:56 +08:00
@sycsycsyc378 德语旧拼法不用,现在的正字法取消了连写时省略的规定。
NeoAtlantis
2015-03-01 18:21:38 +08:00
@arathos 因为id其实是 socketio的连接的id, 指纹是证书的散列。

@Brk 看来要稍后写一个了……
NeoAtlantis
2015-03-01 19:05:53 +08:00
@swordfeng 大概可以说是,如果公钥和人的身份绑定了,那么用私钥签署消息,一旦日后私钥泄漏,这些消息就证实确实是这人发的了。https://otr.cypherpunks.ca/otr-wpes-present.pdf

swordfeng
2015-03-01 20:17:31 +08:00
@NeoAtlantis 这个是的。。。那就消息不签名,用一个每会话唯一的对称密钥加密就行。。。
schezuk
2015-03-01 20:29:58 +08:00
@NeoAtlantis 这糟糕透了,有什么方案能够同时给予ID稳定性并避免失密导致锁定发言人?
NeoAtlantis
2015-03-01 20:32:49 +08:00
@schezuk 那就是OTR(Off The Record)啊……https://otr.cypherpunks.ca/
不过我的这个网站不支持OTR。本来就没有绑定身份……也许以后需要考虑。
schezuk
2015-03-01 21:26:57 +08:00
@NeoAtlantis 关于/t/170114能提些指导意见吗?
pljhonglu
2015-03-01 22:16:54 +08:00
为何不支持回车键发送啊亲~chrome
NeoAtlantis
2015-03-01 22:27:46 +08:00
@pljhonglu 是个bug……本来设计了的= =
现在改过来了,不过不是回车发送,是Ctrl+Enter……
noli
2015-03-01 23:37:30 +08:00
@NeoAtlantis 题主你需要一个C++程序员写加密部分吗?教我ECC的算法,我愿意试试写。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/173678

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX