V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mocococ
V2EX  ›  问与答

最近对 OTP(一次性密码)密码算法比较感兴趣,想要请教一下,有什么方法可以破除 OTP 密码?

  •  
  •   mocococ · 29 天前 · 1873 次点击

    一次性密码( One-Time Password ,OTP )是一种密码认证机制,设计用来增强系统的安全性。这种密码只能使用一次,使用后即失效,因此它能有效防止重放攻击(即攻击者复制一次成功的认证尝试来进行恶意登录)。一次性密码广泛应用于银行、在线服务和其他需要高安全性的领域。

    原理

    TOTP 算法( RFC 6238 ) - 技术实现
    
    密钥共享:
    用户和认证服务器在初始设置时共享一个密钥。
    
    时间戳:
    使用当前的时间戳,通常以 30 秒为单位。
    
    HMAC 算法:
    使用 HMAC (基于哈希的消息认证代码)与共享密钥和时间戳结合生成一个哈希值。
    
    动态截断:
    从 HMAC 生成的哈希值中动态选择一部分作为最终的一次性密码。
    
    12 条回复    2024-10-02 12:02:26 +08:00
    NoOneNoBody
        1
    NoOneNoBody  
       29 天前
    破除的意思是?你想输入任意数字都能过?
    mocococ
        2
    mocococ  
    OP
       29 天前
    @NoOneNoBody 就是破解, 感觉只要不是你和对方(通常是服务器),自己泄露了约定的密钥。

    想要在不知道密钥的情况下,破解开,基本是没办法的吧。

    https://github.com/pquerna/otp
    NoOneNoBody
        3
    NoOneNoBody  
       29 天前   ❤️ 1
    @mocococ #2
    它实际就是哈希,现在也没听过能破哈希的(彩虹表不是破,是获得哈希值查表逆向搜索)

    黑的话
    要么获得客户端唯一标识,让服务器搞不清来源
    要么攻击让服务器 otp 失效
    好像这两个破的目标都不是 otp 本身,而是这两方的安防系统
    abersheeran
        4
    abersheeran  
       29 天前   ❤️ 3
    算法本身肯定没问题。经常攻击别人的朋友都知道,一个系统的安全性是由最弱的那一环决定的。比如你装了浏览器插件用于查看 OTP ,那么攻击者只需要扫你的浏览器存储位置(之前就有人通过扫浏览器目录直接拿到 cookie 等信息代替用户操作)就可以拿到密钥。
    hefish
        5
    hefish  
       29 天前   ❤️ 3
    我最近对故宫文物比较感兴趣,请问哪里可以偷到故宫文物。
    hbtech
        6
    hbtech  
       29 天前 via Android
    30 秒内发 10^6 个请求,从 000000-999999 ,总有一个能对
    mapleleaf2023
        7
    mapleleaf2023  
       28 天前
    如果你成功了,谷歌的 titan 安全 KEY 是不是就失去安全保护的作用了?
    Jueli
        8
    Jueli  
       28 天前 via Android
    @mapleleaf2023 但是记得印象中这种硬件密钥常用的 fido 和本帖提到的 totp 应该是两种不同的概念?
    geelaw
        9
    geelaw  
       28 天前   ❤️ 6
    One-time password 就是 MAC (消息认证码)的一种应用,如果用 HMAC ,那么根据 https://cseweb.ucsd.edu/~mihir/papers/kmd5.pdf 破解的方法是破解底层散列函数的抗碰撞性或者用作 MAC 时的特称不可伪造性( existential unforgeability, EUF )。通常认为使用的散列函数满足这两个性质,因此在模型内无法破解(当然,知道 HMAC 密钥自然就破解了)。

    @NoOneNoBody #3 “破解”一词的三重理解:

    1. 一种无法言说的意思
    2. 及物动词,必须搭配一个宾语,且宾语必须是某个安全性质的名字
    3. 及物动词,宾语可以是安全性质的名字或者密码学对象的名字,如果是后者,则意思等同于 宾语 = 此密码学对象所属类型的最常见的安全性质

    通常来说,散列函数最常见的安全性质是指抗碰撞性,因此“破解散列函数”的意思就是“能够较高效地找到散列函数的碰撞”,所谓“逆向搜索”一般来说理解为计算原像,即破解单向性,破解单向性蕴涵着破解抗碰撞性,因此“没能破哈希”对于某些散列函数是错误的说法。

    当然,我们回到 1 的理解,可以 psychic debug 你的意思是说没有听过能破解散列函数构造的 HMAC 的安全性,这对于一些散列函数也是不对的,比如 MD5 的抗碰撞性质已经破解(允许选择前缀攻击),因此单纯用 MD5 制造的 HMAC 不安全。

    当然,one-time password 使用 MAC 的方式表明即使破解了 EUF 也不代表就能破解 one-time password ,因为 one-time password 里面被认证的消息是时间戳,并不允许使坏者( adversary )任意选择。
    NoOneNoBody
        10
    NoOneNoBody  
       28 天前
    @geelaw #9
    还有比我较真的,哈哈,你这么认真,我就补充两句:
    我问的不是破解的定义,我问的是 OP 所说“破除”的意思,也就是在 OP 语境下他破解的目标
    他的语境是什么呢?标题前置部分:“……对 OTP (一次性密码)密码算法……”

    后续的对话都是围绕这个说的,就是解决或绕过 OTP 并不是想要的讨论,针对算法的方案才是讨论内容
    彩虹表也跟算法没什么关系,就是 input/output 对 的查找,它符合破解定义,但不在算法讨论范围

    明显你比我懂得多,建议你就算法部分和 OP 深入讨论一下,我可以旁观学习
    realpg
        11
    realpg  
       28 天前
    抓住对象, 刑讯逼供, 是最有效的办法
    mocococ
        12
    mocococ  
    OP
       28 天前
    @geelaw
    @NoOneNoBody
    @abersheeran

    感谢大佬们讨论,学习了。对 otp 的这种算法又有了新的了解。

    那天无意间,深入看了一下,突然迷上了,感觉这算法设计地简单又巧妙,同时安全性还很高(我的理解下)。

    所以想看看在什么情况下会破解掉,或许能在大佬们的讨论中找到一些信息或更棒的关于密码相关的算法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3263 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:30 · PVG 19:30 · LAX 04:30 · JFK 07:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.