V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
e4fjui
V2EX  ›  程序员

成功实现了不需要通信的加密向前安全性

  •  
  •   e4fjui · 32 天前 · 1913 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前向安全性,也称为完美前向保密( Perfect Forward Secrecy, PFS ),是指即使长期密钥在未来被破解或泄露,也不会危及过去的通信内容,从而保护过去的通信内容不被破解。 具体来说,如果一个密码系统具有前向安全性,那么在某个时刻之后泄露的密钥将无法解密在此之前加密的数据

    做了一款辅助加密聊天 app(能在 QQ 微信等 app 中发送加密信息),想做到消息在一定时间后无法解密
    刚开始是搞了个时间锁的功能,就是在当前密钥的后方加上日期作为密钥进行加密
    然后解密的时候使用相同操作即可,但是这样直接把设备的日期改了就可以解密之前的内容了

    然后想出了轮换密钥功能
    https://gitlab.com/ivgeek/MixMessage/-/wikis/%E8%BD%AE%E6%8D%A2%E5%AF%86%E9%92%A5
    原理就是利用哈希算法使用当前的密钥计算出下一轮使用的密钥,然后销毁上一轮密钥
    这样即使修改日期,由于哈希算法的不可逆性,也无法逆向推断出之前的密钥
    可自定义轮换的时间(小时),例如 1 小时轮换一次,2 小时后,发送的信息就永远无法解密了
    功能已经全部实现,顺便还会缓存一轮密钥和推断下一次密钥来进行解密(防止存在时间差导致信息无法解密)
    只要 2 台设备的时间差不小于轮换一轮的时间,不需要网络就可进行动态的轮换密钥同步
    而且轮换密钥不需要一直运行 app,例如 1 小时轮换一次,10 天再之后再开机 app 也会自动计算轮换差值立马将密钥轮换到当前日期的正确值

    不过目前的缺点就是没有办法在不需要通信的情况下实现向后安全性(当前密钥泄漏,以后的信息就都能解密了)
    感觉也不可能实现
    项目地址: https://gitlab.com/ivgeek/MixMessage
    第 1 条附言  ·  31 天前
    注意: 是离线应用,没有服务器,不要再说什么 tls 和交换算法了
    应用是本地加密信息然后在 QQ 微信里面发,单纯的单机
    还有什么 TOTP(和时间锁原理一样),主密钥是存在本地的一旦设备被黑客攻击或者丢失被他人获取主密钥,所有信息都可以解密了
    轮换密钥在轮换的时候就会自动销毁上一轮密钥,无法反推,主要是解决设备被入侵或丢失的情况
    24 条回复    2024-08-19 17:54:07 +08:00
    xuanbg
        1
    xuanbg  
       32 天前
    加密通信的基础:IKE 协议,使用非对称加密算法加密交换一个随机的对称加密密钥用于通信数据的加密。密钥都是随机的,哪里还有什么向前向后?泄漏是不可能泄露的,除非有后门。即使泄漏也就是当下及以后,没有什么以前的信息还能解密的可能。
    e4fjui
        2
    e4fjui  
    OP
       32 天前
    @xuanbg 我这个 APP 不需要网络的,也没有服务器,本身不负责发送信息以及交换密钥,是用来在其他 app 中发送信息的,例如微信或者 qq
    gbadge
        3
    gbadge  
       32 天前
    啊哈?!私钥泄露也没事的加密方法?
    mengzhuo
        4
    mengzhuo  
       32 天前
    这……TOTP 难道不比你这安全?
    busier
        5
    busier  
       32 天前
    如果双方都用 PGP 加密,并在回复消息时,在当前密文中带上下一轮要使用的新公钥!实现每条消息都轮换密钥。

    你觉得如何?
    e4fjui
        6
    e4fjui  
    OP
       32 天前
    @busier 那只能一对一了,没办法同时和多个人聊天
    e4fjui
        7
    e4fjui  
    OP
       32 天前
    @mengzhuo totp 就是用时间和主密钥来算出加密的密钥,主密钥一旦泄漏并且知道消息发送时间就能推算出所有密钥了,压根不安全
    e4fjui
        8
    e4fjui  
    OP
       32 天前
    @gbadge 不是没事,是需要更换密钥了,不然以后的消息对方都能解密 ,只是之前的没办法解密
    gbadge
        9
    gbadge  
       31 天前
    @busier 你这个方法更绝
    datocp
        10
    datocp  
       31 天前 via Android
    在用 stunnel 说用的证书链加密

    1.服务器端每 30 分钟变换公钥?
    2.服务器 rr 负载打散到不同端口,不同服务器的不同端口

    不知道中间人还有能力把这些信息组合起来,还得再解密。。。
    hanyuwei70
        11
    hanyuwei70  
       31 天前   ❤️ 1
    为什么不去看看 TLS 的实现呢……?
    churchmice
        12
    churchmice  
       31 天前
    你用 PKI 相互协商一个随机数来做秘钥不好吗
    需要整如此麻烦吗
    dj721xHiAvbL11n0
        13
    dj721xHiAvbL11n0  
       31 天前
    @busier 如果消息延迟或者丢了一个,是不是后面的都错乱了
    dj721xHiAvbL11n0
        14
    dj721xHiAvbL11n0  
       31 天前
    一小时轮换一次,假如我们俩个时间差 1 秒轮换了,我 7.59.59 ,你已经 8.00.00 了,是不是就要出问题了?
    dode
        15
    dode  
       31 天前
    搞一个中间服务器,支持自行部署,每小时清理一下过期消息,双方同时在线才发端对端加密消息
    exiledkingcc
        16
    exiledkingcc  
       31 天前
    学而不思则罔 思而不学则殆。
    密码学是很成熟的学科了,不适合闭门造车。
    mengzhuo
        17
    mengzhuo  
       31 天前
    @e4fjui 主密钥泄露……你这也不一样么?

    对自己算法有信心试试发个 arxiv ,看看有没有密码学家喷你哈。
    liuidetmks
        18
    liuidetmks  
       31 天前
    程序员不要自创密钥交互方法。

    可以去这里问问专业一点的建议
    crypto.stackexchange.com
    e4fjui
        19
    e4fjui  
    OP
       31 天前
    @mengzhuo 我这个是定期轮换,轮换过后就会删除之前的密钥,删除之后密钥就不存在了,也就没有泄漏的可能
    e4fjui
        20
    e4fjui  
    OP
       31 天前
    @x2420390517 上面已经说了,会缓存上一次轮换的密钥,没有问题的,时间快了也能处理,会推算下一次的密钥进行解密
    e4fjui
        21
    e4fjui  
    OP
       31 天前
    @exiledkingcc 但是没有这方面的解决方案,而且只是单纯的哈希算法,并没有造出来新的算法
    e4fjui
        22
    e4fjui  
    OP
       31 天前
    @churchmice
    @hanyuwei70 说了是离线应用了,没有服务器的,没必要实现通信,单纯的加密信息在 QQ 或者微信里面发
    busier
        23
    busier  
       31 天前
    @x2420390517 没关系啊,就按照断线处理,重新初始化连接,重新协商新的密钥对。
    Esec
        24
    Esec  
       31 天前
    看来,以后要默认封禁不用地球语言交流的用户了,就像现在部署的过滤规则那样……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1546 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:59 · PVG 00:59 · LAX 09:59 · JFK 12:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.