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

登录接口防重放攻击怎样设计?

  •  1
     
  •   cl76915557 · 2 days ago via iPhone · 5062 views

    请教各位大神一个登录接口安全问题。 我们大作业 web 系统 账号密码登录的现有设计:客户端先拉取服务端 RSA 公钥,使用公钥加密用户名密码提交登录接口。 我发现这个只能防止密码明文被抓包窃听,无法防御重放攻击,攻击者捕获加密报文就可以反复重放登录。 所以 ai 调研了几个方案 1. 新增 challenge 接口,登录前获取一次性 challenge ,challenge 和账号密码一起加密,消费即作废; 2. 客户端携带 nonce+timestamp 随请求一起加密,服务端校验时间窗口+redis 校验 nonce 防重复。

    想问下线上用户名密码登录场景,哪一种落地更多? challenge 模式两次接口会不会有什么短板?感谢大家。

    47 replies    2026-09-03 14:20:40 +08:00
    dzdh
        1
    dzdh  
       2 days ago
    rsa 公钥你弄个 md5 指纹。只能用一次。一次一生成 rsa 公钥 :doge:
    Liu6
        2
    Liu6  
       2 days ago
    额, 这 sign 不就很符合你的场景吗? sign 可以严格一次, 也可以时间窗口,也不需要使用缓存等资源。
    Liu6
        3
    Liu6  
       2 days ago
    @Liu6 #2 现在是 AI 时代, 直接问 AI 吧。 除了 AI 我现在都快啥都不会了
    godall
        4
    godall  
       2 days ago
    防重放攻击的标准做法就是 nonce+timestamp 啊,没什么好争议的。
    liKeYunKeji
        5
    liKeYunKeji  
       2 days ago
    header 做一次性的校验码( token\sign\自定加密参数)
    dimwoodxi27
        6
    dimwoodxi27  
       2 days ago
    用 wasm+图片隐写,sign 设置唯一条件,甩给前端动态 vmjs 来取图的 sign 值;随机数加时间戳有啥意义,又不支持无状态验证还浪费资源
    cowcomic
        7
    cowcomic  
       2 days ago
    nonce+timestamp 这个就行啊,标准做法
    opengps
        8
    opengps  
       2 days ago
    带上时间,有效期 1 分钟啊
    esee
        9
    esee  
       2 days ago
    关键接口 消费一次即 作废,但是这样有时候网络不好系统自动重试 也会有问题,你要做好兼容 ;一般接口加签名和时间戳就行了啊。你对接一下大厂的接口,基本也是这样设计的
    xiangyuecn
        10
    xiangyuecn  
       2 days ago
    如果你说的重放,指的是用户自己调试拿到请求参数,再发起请求,这种本身是防不住的 任何公司都一样 破解成本而已。只要够复杂 或者 没有价值 人家就懒得搞你。另外你也可以直接封号

    如果你指的传输线路上的网络数据包可以被窃取然后重放,并且能拿到响应明文,那你真该死啊,最低上个 https 啊🤡 自己发明一套 https 必要性不大,除非你 http 上能做的比 https 更好
    lululau
        11
    lululau  
       2 days ago
    防重放你登录接口防个鸡毛的重放啊。。。最讨厌这种又是防这个又是防那个,又是加密又是解密,不懂装懂的“需求”了,https 了解一下呢?
    xiangyuecn
        12
    xiangyuecn  
       2 days ago
    如需 https 证书,欢迎使用单文件网页版 ACME 客户端申请证书,向 Let's Encrypt 、ZeroSSL 、Google 等支持 ACME 协议的证书颁发机构,免费申请获得 通配符泛域名证书 IP 证书

    https://xiangyuecn.github.io/ACME-HTML-Web-Browser-Client/ACME-HTML-Web-Browser-Client.html
    dingwen07
        13
    dingwen07  
       2 days ago
    大多数线上系统不在前端/应用层加密/哈希密码,直接明文走 HTTPS 。
    yinmin
        14
    yinmin  
       2 days ago via iPhone
    web 系统上 https 就行了,天然防止重放的
    InDom
        15
    InDom  
       2 days ago
    nonce+timestamp 就是主流方案, 至于 nonce 是客户端生成还是服务器下发都可以, 看业务要求.

    登陆确实防重放的需求不高, 如果是全局统一包一层页是很正常的, 如果是单独给某个接口加的话.

    我觉得登陆这样读操作是没必要加的, 写操作加就 ok 了.
    dddd1919
        16
    dddd1919  
       2 days ago
    1 用于和不可信用户端交互,由服务端全权处理,相当于每次请求都要预授权后才能真正发起,用完即销毁,安全但比较麻烦
    2 用于和对方可信的客户端交互,客户端和服务端使用相同方式加签验签,两边各自存储密钥且不勇于交互时传输

    看你使用的场景决定用哪种
    unused
        17
    unused  
       2 days ago via Android
    先弄清楚你要防的是什么,按你说的“攻击者捕获加密报文就可以反复重放登录”,正解就是 TLS,不要自己发明安全方案
    milkleeeeee
        18
    milkleeeeee  
       2 days ago
    好久没看到技术类帖子了,现在应该都直接问 AI 了吧
    liulihaocai
        19
    liulihaocai  
       2 days ago
    加一个 reCAPTCHA 不就好了
    pxllong
        20
    pxllong  
       2 days ago
    nonceStr 随机字符串。 配合下时间。nonceStr 只能使用一次。 重放能解决。
    seedhk
        21
    seedhk  
       2 days ago
    方案 2 ,多一个请求没必要
    prosgtsr
        22
    prosgtsr  
       2 days ago
    nonce
    faceRollingKB
        23
    faceRollingKB  
       2 days ago
    加验证码,MFA 、短信、邮箱、行为都可以
    coderzhangsan
        24
    coderzhangsan  
       2 days ago
    1. 先了解下 API 重放攻击的目的和应用场景,作为一个开放接口,登录接口安全防范的重点,难道不是防刷撞库吗?
    2. 客户端拉取 RSA 公钥?先了解下 http 和 https 协议。
    Tink
        25
    Tink  
       2 days ago
    nonce+timestamp
    codehz
        26
    codehz  
       2 days ago
    https 就完事了,非要考虑 https 解密的场景的话别人也可以直接在页面上加键盘记录器()都解密了肯定有能力改内容()
    真喜欢做 challenge 就用 OPAQUE 方法
    seers
        27
    seers  
       2 days ago via iPhone
    https 明文发都来了,脚本 boy 抓个包服务器给你打烂。。
    GoogleQi
        28
    GoogleQi  
       2 days ago
    所有的网页都是防君子不防小人
    rangoBen
        29
    rangoBen  
       2 days ago
    防君子不防小人,如果用户的设备都被黑了,你给他发啥不都是透明的。
    1.给个图片验证码,限制一下机器、脚本这种。
    2.不嫌麻烦,再限制一下单 ip 请求频次
    3.补充下 https 知识,如果用了 https ,自己由搞一套密钥给客户端,属于秋裤套在棉裤上,过于 cool 。
    TLS 的设计就是用非对称协商出的对称加密,防中间人篡改,重放攻击等等。只要办法签名的政府机构没间谍,无需担心证书不可信。
    ala2008
        30
    ala2008  
       2 days ago
    登陆做防重放有什么意义,不懂。你应该要做怎么避免暴力轮询破解
    a645588
        31
    a645588  
       2 days ago
    问题是 web 前端项目,代码算法都是公开的,不走重放也能直接发起新的请求吧
    deavorwei
        32
    deavorwei  
       1 day ago
    RSA 记得用 2048 ,上周我花了 7 个小时把 RSA512 跑出来了
    rekulas
        33
    rekulas  
       1 day ago
    26 年了还有自己造 ssl 通信的吗。。。非要加密 aes 就够了,反正遇到需要破解的难度都一样没啥区别
    back0893
        34
    back0893  
       1 day ago
    登录 token+验证码
    GodVan
        35
    GodVan  
       1 day ago
    nonce+timestamp+超频限制,弹验证码或者冷却
    onice
        36
    onice  
       1 day ago
    你登陆接口都没验证码么?验证码就相当于随机数了。每次登录的包,验证码都不一样,自然就不能重放了。
    cslive
        37
    cslive  
       1 day ago
    上验证码,谷歌那种点击图片的
    blankmiss
        38
    blankmiss  
       1 day ago
    签名呗
    dingwen07
        39
    dingwen07  
       1 day ago
    @seers #27 PoW 了解一下,想 DoS 就“挖矿”去吧
    根据 IP 质量、请求数量等风控 verdict 动态决定 PoW 难度进行限流
    jacksparrow414
        40
    jacksparrow414  
       1 day ago
    刚好前几天我写了一篇关于这方面的一篇博文 https://blog.csdn.net/dghkgjlh/article/details/163342943 希望对你有点帮助,长话短说就是 Nonce+Timestamp
    srat1999
        41
    srat1999  
       1 day ago
    1 、加 csrftoken 2 、暴力一点三次验证失败直接封锁 ip ,让等几分钟再验证
    LandCruiser
        42
    LandCruiser  
       1 day ago
    试想一下,我都能截获你的报文了,你的报文无论是什么,都没有意义了对吗?我都能截获你的报文了,我直接拿你接口的返回值渲染到我自己的页面上就行了。但是问题就是在这里,别人怎么截获你的报文呢?截获不到的。
    dode
        43
    dode  
       1 day ago
    攻击者还可以拦截,替换公钥呢
    cl76915557
        44
    cl76915557  
    OP
       1 day ago via iPhone
    谢谢大家的回复
    xx6412223
        45
    xx6412223  
       1 day ago
    先明确需求,我理解你是要解决 Man‑in‑the‑Middle
    最简单的就是 https
    还有一种,就是这个 middle man 的组织可以控制你的证书库,比如公司的 IT ,可以所有 HTTPS 流量经过企业网关做 SSL‑MITM 解密审计
    1: 应用自加密,提前双方内置一个 share secret,不能是每次协商生成的。这个 secret 可以线下传输或者每次用本地的对段证书加密一个再传输
    2: 用 VPN ,VPN 客户端要使用独立的证书库
    xuanbg
        46
    xuanbg  
       1 day ago
    可以用令牌桶限流,每个账号每秒只能请求 1 次,超出的自接丢弃不处理
    xuanbg
        47
    xuanbg  
       1 day ago
    登录防重放很简单啊,客户端先获取一个临时的譬如 3 秒内有效的随机字符串做盐就行。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5372 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 123ms · UTC 07:55 · PVG 15:55 · LAX 00:55 · JFK 03:55
    ♥ Do have faith in what you're doing.