嗯,这是我写的一个端到端的加密聊天网站。名称来自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盾,但是能加密解密各种消息等等)。不过这方面的进展还是很慢。于是就先弄了个副产品出来。
1
won 2015-03-01 08:46:29 +08:00
不错,之前在用bitchat
|
2
swordfeng 2015-03-01 09:40:35 +08:00 via Android
不错
签名也可以ed25519试试,ecdsa请不要使用pist系曲线 如果可以存储和使用本地证书更好 独立硬件写驱动挺麻烦。。。 前端什么的。。。找人合作呀 |
3
NeoAtlantis OP @swordfeng 目前聊天里面程序发送的消息进行了签名,不过解密之后没验证(如果验证就要解决验证不通过的问题,我还是懒(摊手,明明就是多几行代码的事情)……此外我不知道聊天里面用数字签名是不是好方案(参考OTR的作者的论述)
ed25519没找到js的实现……其实要不是看上椭圆曲线那种短小的签名,我打算以后可能在硬件里面用Merkle签名算法呢(不过这算法要大量的散列计算,至少要用C实现才实用)。现在能找到的网上各种库的ECDSA多数都是那个MIT的叫Tom Wu写的,真是天下代码一大抄…… 证书的东西下一步也许会考虑。目前希望设计的是牺牲一点严谨的安全性,但是让人能尽快进入聊天。 也许可以做个比如在聊天时,有时间了就存下自己的证书和对方的指纹(不是证书,我的体系里面指纹是直接从证书导出的),记录信任关系。以后见到同样的指纹了就标记可信。 |
4
Bubing 2015-03-01 10:46:22 +08:00
其实信息泄露不一定在服务器上 输入法已经收集你的关键词信息了 企鹅等等 监控输入法是最最基本的了
|
5
swordfeng 2015-03-01 10:58:50 +08:00 via Android
|
6
Brk 2015-03-01 11:14:32 +08:00
github上没写安装说明阿
|
7
subpo 2015-03-01 11:32:14 +08:00
开放交友功能吧,约炮神器
|
8
sycsycsyc378 2015-03-01 13:51:49 +08:00
名称少了个s
|
9
fuxkcsdn 2015-03-01 15:10:01 +08:00
Windows 8.1 x64 IE11 卡在
正在连接到服务器,请稍候... FF正常 |
10
arathos 2015-03-01 15:46:09 +08:00
指纹为什么都是不一样的 id一样
|
11
NeoAtlantis OP @sycsycsyc378 德语旧拼法不用,现在的正字法取消了连写时省略的规定。
|
12
NeoAtlantis OP |
13
NeoAtlantis OP @swordfeng 大概可以说是,如果公钥和人的身份绑定了,那么用私钥签署消息,一旦日后私钥泄漏,这些消息就证实确实是这人发的了。https://otr.cypherpunks.ca/otr-wpes-present.pdf
|
14
swordfeng 2015-03-01 20:17:31 +08:00 via Android
@NeoAtlantis 这个是的。。。那就消息不签名,用一个每会话唯一的对称密钥加密就行。。。
|
15
schezuk 2015-03-01 20:29:58 +08:00
@NeoAtlantis 这糟糕透了,有什么方案能够同时给予ID稳定性并避免失密导致锁定发言人?
|
16
NeoAtlantis OP |
17
schezuk 2015-03-01 21:26:57 +08:00
@NeoAtlantis 关于/t/170114能提些指导意见吗?
|
18
pljhonglu 2015-03-01 22:16:54 +08:00
为何不支持回车键发送啊亲~chrome
|
19
NeoAtlantis OP @pljhonglu 是个bug……本来设计了的= =
现在改过来了,不过不是回车发送,是Ctrl+Enter…… |
20
noli 2015-03-01 23:37:30 +08:00
@NeoAtlantis 题主你需要一个C++程序员写加密部分吗?教我ECC的算法,我愿意试试写。
|
21
NeoAtlantis OP @noli 暂时没这个打算……我也没自己写所有的密码算法。Salsa20是我写的,ChaCha20是我改的,剩下的散列Whirlpool、curve25519和ECDSA就是直接复制的。现在面临的问题是,我得能验证算法是正确的、标准的实现(比如能用一些测试向量来验证)。
Salsa20、ChaCha20和Whirlpool我有信心(已经验证),curve25519信心稍差,但是作者自己有个验证的示例。ECDSA就没啥信心了。ECDSA我倒是比较希望有一个更清晰的javascript的代码来替换掉Tom Wu的乱七八糟的东西(jsbn库),而且速度上也不要太慢(jsbn其实是很快的)。如果不能,我可能打算把ECDSA换成ed25519呢。 以后做成硬件的时候确实可能要把一些功能在某些平台上(比如NodeJS)用C替换掉,但是还要保证替换的部分放进现有的js里面能完全兼容,所以我的设想是只替换基础的算法(比如Whirlpool,比如curve25519,比如Salsa20)。现在还是能找到这些算法的C版本的,比如curve25519的官网http://cr.yp.to/ecdh.html 就有代码。散列什么的更不是问题。 |
22
noli 2015-03-02 00:13:21 +08:00
@NeoAtlantis 好的,我明白了。其实是我也在做P2P加密通信的东西,希望以后有机会的话可以合作。我已经在 Github 上面关注你了。
|
24
pljhonglu 2015-03-02 09:47:47 +08:00
@NeoAtlantis 感谢作者~
|