V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
NeoAtlantis
V2EX  ›  分享创造

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

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

    嗯,这是我写的一个端到端的加密聊天网站。名称来自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:58:50 +08:00 via Android
    @NeoAtlantis 唔。。。签名消息会有什么问题吗……求参考链接
    安全设计一开始就要做,防止后期出现问题
    存指纹吧。。。不过在网页上有点麻烦
    Brk
        6
    Brk  
       2015-03-01 11:14:32 +08:00
    github上没写安装说明阿
    subpo
        7
    subpo  
       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   ·   实用小工具   ·   1124 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:50 · PVG 02:50 · LAX 10:50 · JFK 13:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.