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

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

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

    如果你指的传输线路上的网络数据包可以被窃取然后重放,并且能拿到响应明文,那你真该死啊,最低上个 https 啊🤡 自己发明一套 https 必要性不大,除非你 http 上能做的比 https 更好
    lululau
        11
    lululau  
       11 days ago
    防重放你登录接口防个鸡毛的重放啊。。。最讨厌这种又是防这个又是防那个,又是加密又是解密,不懂装懂的“需求”了,https 了解一下呢?
    xiangyuecn
        12
    xiangyuecn  
       11 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  
       11 days ago
    大多数线上系统不在前端/应用层加密/哈希密码,直接明文走 HTTPS 。
    yinmin
        14
    yinmin  
       11 days ago via iPhone
    web 系统上 https 就行了,天然防止重放的
    InDom
        15
    InDom  
       11 days ago
    nonce+timestamp 就是主流方案, 至于 nonce 是客户端生成还是服务器下发都可以, 看业务要求.

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

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

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