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

还以为微软的 BitLocker 有什么特别的防破解之道,去学了一下源代码,原来就是对用户密码 hash 自循环 100 万次。

  •  
  •   tool2d · 2022-11-11 09:26:12 +08:00 · 6524 次点击
    这是一个创建于 503 天前的主题,其中的信息可能已经有所发展或是发生改变。
    真是足够简单和暴力的,还别说普通的电脑 sha256 循环计算 100 万次,还是需要那么一点时间的。

    这点时间就可以防止黑客用字典的方式暴力破解本地密码。

    相对来说,还算安全吧。

    25 条回复    2022-11-14 09:55:54 +08:00
    cooioobb
        1
    cooioobb  
       2022-11-11 09:35:07 +08:00 via Android
    确实稳妥简单。也够用
    shinession
        2
    shinession  
       2022-11-11 09:35:33 +08:00
    涨姿势了 :)
    leavic
        3
    leavic  
       2022-11-11 09:48:42 +08:00   ❤️ 1
    密码学应用基本原则不就是不要自己发明轮子吗
    eason1874
        4
    eason1874  
       2022-11-11 09:55:37 +08:00
    这是防爆破最佳实践吧,挺多软件都是这样做
    litmxs
        5
    litmxs  
       2022-11-11 09:57:08 +08:00 via Android
    慢哈希
    codehz
        6
    codehz  
       2022-11-11 09:58:57 +08:00   ❤️ 1
    你这是哪来的 bit locker ,怎么还有 gbk_to_unicode 的
    CatCode
        7
    CatCode  
       2022-11-11 10:01:46 +08:00
    应该是逆向来的代码吧
    shuxhan
        8
    shuxhan  
       2022-11-11 10:50:59 +08:00
    最简单的方式 也是最有效的
    tool2d
        9
    tool2d  
    OP
       2022-11-11 10:51:37 +08:00
    @codehz gbk_to_unicode 是我自己加的,哈哈。

    微软的 1 百万次 hash 算法是 github 上找的,一搜一大把。
    ipwx
        10
    ipwx  
       2022-11-11 10:58:06 +08:00   ❤️ 1
    这点时间就可以防止黑客用字典的方式暴力破解本地密码。

    参数里面的 r_salt:请,认真地看着我。
    ----

    哈希类验证防止彩虹表的方法有两布:

    1. 加盐。
    2. 更多的哈希循环。

    缺一不可。
    ipwx
        11
    ipwx  
       2022-11-11 10:58:33 +08:00
    @tool2d 请认真地查找一下有关“加盐”的资料。
    majula
        12
    majula  
       2022-11-11 11:14:01 +08:00
    哈哈,微软真的是思路清奇

    记得以前有个 Password Hashing Competition ,参赛者选择的 hash function 基本上都是 blake2/sha512 ,没有用 sha256 的(大概是因为 sha256 用硬件加速成本太低了),最后胜出的是 argon2 (也是基于 blake2 )

    不知道微软当年有没有考虑参赛(狗头
    matrix67
        13
    matrix67  
       2022-11-11 11:18:28 +08:00
    我记得 keepass 还是 truecrypt 的 hash 迭代次数,就是 ( 1s /你本机算一次 hash 的时间)。这样你每次解开主密码需要 1s ,但是黑客受不了。
    matrix67
        14
    matrix67  
       2022-11-11 11:20:20 +08:00
    @matrix67 #13 是 keepass https://keepass.info/help/base/security.html

    By clicking the '1 Second Delay' button in the database settings dialog, KeePass computes the number of iterations that results in a 1 second delay when loading/saving a database.
    tool2d
        15
    tool2d  
    OP
       2022-11-11 12:08:50 +08:00
    @ipwx 个人觉得盐其实无所谓,学 RSA 加密标准里,对 padding 取随机数就可以了。
    tool2d
        16
    tool2d  
    OP
       2022-11-11 12:46:31 +08:00
    @tool2d 不好意思,搞错了。hash 不是加密,不能通过随机 padding 来还原。保存盐是必须的步骤。
    billlee
        17
    billlee  
       2022-11-11 13:41:10 +08:00 via Android
    这是 KDF 的标准做法
    jim9606
        18
    jim9606  
       2022-11-11 13:46:40 +08:00 via Android
    @majula bitlocker 是跟随 vista 一起推出的功能,那时候 blake 都还没诞生,很多现在使用的密码原语都还没标准化。
    Bitlocker 主要优势还是操作系统集成,例如基于 TPM 的自动解锁。想在 linux 用开源组件复刻这套功能还蛮麻烦的。
    antness
        19
    antness  
       2022-11-11 13:49:49 +08:00 via Android
    @ipwx 如果把上一步的 hash 结果用来生成盐会不会有什么用,比如可以减少循环次数但不减弱强度等等呢
    ipwx
        20
    ipwx  
       2022-11-11 13:54:01 +08:00
    @antness 只要没有随机数参与,就一定存在彩虹表。标准的 hash 做法是把盐这个随机数存下来的。
    44670
        21
    44670  
       2022-11-11 20:25:11 +08:00
    比较通用的实践是 pbkdf2 ,除了不断对自身 hmac 以外,还会和上一轮的结果异或一下
    antness
        22
    antness  
       2022-11-12 00:24:01 +08:00
    @ipwx 原来如此
    LittleDust
        23
    LittleDust  
       2022-11-12 07:13:38 +08:00 via iPhone
    这个循环里面 1024 * 1024 可以提出去吧…每次循环都要计算一下,这是微软源码?
    kice
        24
    kice  
       2022-11-13 02:24:14 +08:00 via Android   ❤️ 3
    @LittleDust 编译器优化里面有一个叫做常量折叠的操作,可以去了解看看。
    julyclyde
        25
    julyclyde  
       2022-11-14 09:55:54 +08:00
    多次 hash 会导致冲突增加吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3907 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:29 · PVG 18:29 · LAX 03:29 · JFK 06:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.