狼窝:另一个(端到端)加密聊天的聊天室 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
NeoAtlantis
V2EX    分享创造

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

  •  
  •   NeoAtlantis
    neoatlantis 2015-03-01 08:04:31 +08:00 11341 次点击
    这是一个创建于 3882 天前的主题,其中的信息可能已经有所发展或是发生改变。

    嗯,这是我写的一个端到端的加密聊天网站。名称来自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盾,但是能加密解密各种消息等等)。不过这方面的进展还是很慢。于是就先弄了个副产品出来。

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

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

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

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

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

    swordfeng
        14
    swordfeng  
       2015-03-01 20:17:31 +08:00 via Android
    @NeoAtlantis 这个是的。。。那就消息不签名,用一个每会话唯一的对称密钥加密就行。。。
    schezuk
        15
    schezuk  
       2015-03-01 20:29:58 +08:00
    @NeoAtlantis 这糟糕透了,有什么方案能够同时给予ID稳定性并避免失密导致锁定发言人?
    NeoAtlantis
        16
    NeoAtlantis  
    OP
       2015-03-01 20:32:49 +08:00
    @schezuk 那就是OTR(Off The Record)啊……https://otr.cypherpunks.ca/
    不过我的这个网站不支持OTR。本来就没有绑定身份……也许以后需要考虑。
    schezuk
        17
    schezuk  
       2015-03-01 21:26:57 +08:00
    @NeoAtlantis 关于/t/170114能提些指导意见吗?
    pljhonglu
        18
    pljhonglu  
       2015-03-01 22:16:54 +08:00
    为何不支持回车键发送啊亲~chrome
    NeoAtlantis
        19
    NeoAtlantis  
    OP
       2015-03-01 22:27:46 +08:00
    @pljhonglu 是个bug……本来设计了的= =
    现在改过来了,不过不是回车发送,是Ctrl+Enter……
    noli
        20
    noli  
       2015-03-01 23:37:30 +08:00
    @NeoAtlantis 题主你需要一个C++程序员写加密部分吗?教我ECC的算法,我愿意试试写。
    NeoAtlantis
        21
    NeoAtlantis  
    OP
       2015-03-01 23:53:01 +08:00
    @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 就有代码。散列什么的更不是问题。
    noli
        22
    noli  
       2015-03-02 00:13:21 +08:00
    @NeoAtlantis 好的,我明白了。其实是我也在做P2P加密通信的东西,希望以后有机会的话可以合作。我已经在 Github 上面关注你了。
    schezuk
        23
    schezuk  
       2015-03-02 01:26:43 +08:00
    @noli 关于/t/170114能提些指导意见吗?
    求集思广益,QQ群417216334
    pljhonglu
        24
    pljhonglu  
       2015-03-02 09:47:47 +08:00
    @NeoAtlantis 感谢作者~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4192 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 04:09 PVG 12:09 LAX 21:09 JFK 00:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86