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

代理能够重发消息吗?

  •  
  •   jimmyismagic · 2020-12-04 21:39:16 +08:00 · 2264 次点击
    这是一个创建于 1457 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假如你连了一个恶意的代理,连上一个 https 服务,一般代理是看不到你发送的内容的

    但是,代理能不能劫持你的加密内容,重复发送给对应服务,我感觉不太可能,因为 http 是无状态的,链接建立处理完消息就断了,一般不能在一个链接内处理两个 POST 请求,我这个看法不知道对不对?

    但如果我连的是一个 websocket(wss)服务,使用了中间代理,这个代理能不能劫持我的消息多次重发?

    假设链接的服务是买卖股票,那有没有可能在买股票的时候被代理恶意重发而重复购买?

    19 条回复    2020-12-05 18:28:25 +08:00
    superrichman
        1
    superrichman  
       2020-12-04 21:49:07 +08:00 via iPhone
    代理看不到明文但可以抓包重放。
    服务端没事防重放处理就有可能会重复购买。
    不要用无法信任的代理服务。
    lujjjh
        2
    lujjjh  
       2020-12-04 22:21:20 +08:00
    你也太小看 TLS 协议了。

    「因为 http 是无状态的,链接建立处理完消息就断了,一般不能在一个链接内处理两个 POST 请求」也是错误的。
    neteroster
        3
    neteroster  
       2020-12-04 22:24:23 +08:00 via Android   ❤️ 1
    关键词: https replay attack
    des
        4
    des  
       2020-12-04 22:50:24 +08:00 via iPhone
    不仅不能重放,而且还能向前保密,确保私钥泄漏也不能解密
    http://wmaintw.github.io/2015/03/07/perfect-forward-secrecy.html
    iceheart
        5
    iceheart  
       2020-12-04 23:04:18 +08:00 via Android
    理论上是可能的,-----比如说大整数质因数分解被攻破,或者 AES 对称加密被破解。
    carlclone
        6
    carlclone  
       2020-12-04 23:26:25 +08:00 via Android
    @des 这么恐怖吗,真没想过还能录制下来等以后解密的神操作
    ZRS
        7
    ZRS  
       2020-12-04 23:46:40 +08:00 via iPhone
    TLS 是防重放的
    baobao1270
        8
    baobao1270  
       2020-12-04 23:52:16 +08:00   ❤️ 2
    HTTPS 可以防止重放攻击,HTTP 若服务端无防御措施无法防御
    xcstream
        9
    xcstream  
       2020-12-05 02:45:41 +08:00
    应该不能
    deorth
        10
    deorth  
       2020-12-05 09:54:22 +08:00
    甚至不需要代理,只要路由转发链路上的某一台机器部署了相应服务就可以实现重放。
    要是和钱相关的服务连防重放都做不到可以赶紧倒闭了
    jimmyismagic
        11
    jimmyismagic  
    OP
       2020-12-05 10:36:54 +08:00
    @superrichman https 服务端真的需要防止吗?
    @lujjjh 举个例子?
    @neteroster 多谢,有没有权威的论述?
    @des 所以你们到底谁正确?
    @iceheart 嗯,被破解当然可以,假如加密无法破解的情况下,用 https 可以防止重放吗?
    @ZRS 所以你们到底谁对?说说原因
    @baobao1270 我感觉也是,websocket(wss)呢?
    @xcstream websocket(wss)呢?
    @deorth 不止和钱相关,各种操作都有对个人的数据造成风险,不可能每次写个接口都要考虑是否要防止重放吧
    baobao1270
        12
    baobao1270  
       2020-12-05 10:55:36 +08:00
    @jimmyismagic Websocket 好像无法防止,WSS 可以。或者说任何使用 TLS 的应用都能防止重放

    但是,在设计程序时,会在 HTTP 应用层再做一次防重放。不过 Websocket 做防止重放的比较少,一般来说 WS 不涉及重要操作,比如聊天,重复一句也是可以的。
    jimmyismagic
        13
    jimmyismagic  
    OP
       2020-12-05 11:12:40 +08:00
    @des 看了你的文章,才知道密钥协商还有这个功能,怪不得我看到很多私有服务都采用 DH 算法,原先以为一个随机密钥就可以了,现在相当于该次连接中在内存中保留了随机私钥没有传输。那么 https 默认是否使用了 DH 这个方式呢?还是哪里需要配置,或者需要在双方应用层协商?
    jimmyismagic
        14
    jimmyismagic  
    OP
       2020-12-05 11:14:28 +08:00
    @baobao1270 wss 感觉应该也无法防止啊,因为你的链接没有断开,服务端直接收消息处理就行了
    superrichman
        15
    superrichman  
       2020-12-05 12:24:33 +08:00
    tls1.3 0-RTT replay
    译文 (可重复性 章节)
    https://www.oschina.net/translate/rfc-8446-aka-tls-1-3?lang=chs&p=3
    原文 (Replayability 章节)
    https://blog.cloudflare.com/rfc-8446-aka-tls-1-3/

    还是要在应用里做防重放.
    jimmyismagic
        16
    jimmyismagic  
    OP
       2020-12-05 13:05:39 +08:00
    @des
    @superrichman
    你们两个各有道理,所以到底能不能重放?
    des
        17
    des  
       2020-12-05 18:14:18 +08:00 via iPhone
    @jimmyismagic
    我认为你都没有好好看,能不能要看服务端和客户端的具体配置
    如果你非要一个结果,那就是可以
    des
        18
    des  
       2020-12-05 18:23:00 +08:00 via iPhone
    @des
    在没有指定场景的情况下,我可以假定客户端服务端能接受不安全的加密。
    甚至可以假定客户端能接受任何不安全的证书,这种情况都可以中间人攻击
    jimmyismagic
        19
    jimmyismagic  
    OP
       2020-12-05 18:28:25 +08:00
    @des 当然不考虑中间人攻击和客户端安全证书的问题,就是在正常的情况下,你说了一个是保留历史,等未来拿到私钥或者算法破解了,还有一个是用 DH 算法,可以做到完全向前保密,那么在正常的一个 https 链接下,能不能发两次 POST,http 中的 keep-alive 能不能做到呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1031 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 19:12 · PVG 03:12 · LAX 11:12 · JFK 14:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.