• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jimmyismagic
V2EX  ›  程序员

代理能够重发消息吗?

  •  
  •   jimmyismagic · Dec 4, 2020 · 2948 views
    This topic created in 2037 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

    但是,在设计程序时,会在 HTTP 应用层再做一次防重放。不过 Websocket 做防止重放的比较少,一般来说 WS 不涉及重要操作,比如聊天,重复一句也是可以的。
    jimmyismagic
        13
    jimmyismagic  
    OP
       Dec 5, 2020
    @des 看了你的文章,才知道密钥协商还有这个功能,怪不得我看到很多私有服务都采用 DH 算法,原先以为一个随机密钥就可以了,现在相当于该次连接中在内存中保留了随机私钥没有传输。那么 https 默认是否使用了 DH 这个方式呢?还是哪里需要配置,或者需要在双方应用层协商?
    jimmyismagic
        14
    jimmyismagic  
    OP
       Dec 5, 2020
    @baobao1270 wss 感觉应该也无法防止啊,因为你的链接没有断开,服务端直接收消息处理就行了
    superrichman
        15
    superrichman  
       Dec 5, 2020
    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
       Dec 5, 2020
    @des
    @superrichman
    你们两个各有道理,所以到底能不能重放?
    des
        17
    des  
       Dec 5, 2020 via iPhone
    @jimmyismagic
    我认为你都没有好好看,能不能要看服务端和客户端的具体配置
    如果你非要一个结果,那就是可以
    des
        18
    des  
       Dec 5, 2020 via iPhone
    @des
    在没有指定场景的情况下,我可以假定客户端服务端能接受不安全的加密。
    甚至可以假定客户端能接受任何不安全的证书,这种情况都可以中间人攻击
    jimmyismagic
        19
    jimmyismagic  
    OP
       Dec 5, 2020
    @des 当然不考虑中间人攻击和客户端安全证书的问题,就是在正常的情况下,你说了一个是保留历史,等未来拿到私钥或者算法破解了,还有一个是用 DH 算法,可以做到完全向前保密,那么在正常的一个 https 链接下,能不能发两次 POST,http 中的 keep-alive 能不能做到呢?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2948 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 07:25 · PVG 15:25 · LAX 00:25 · JFK 03:25
    ♥ Do have faith in what you're doing.