【问题标题】:Spring Security BCrypt Password Encoder - Workload FactorSpring Security BCrypt 密码编码器 - 工作量因素
【发布时间】:2016-07-05 05:47:30
【问题描述】:

我正在将 Spring Security 的 Bcrypt 密码编码器集成到一个新的应用程序中,在测试时我注意到当使用具有不同工作因素的两个编码器匹配密码时,工作负载似乎没有影响。举个例子:

public static void main(String[] args) {
    PasswordEncoder strongEncoder = new BCryptPasswordEncoder(12);
    PasswordEncoder weakEncoder = new BCryptPasswordEncoder(6);

    String password = "SomePassword@@";

    String strongEncodedPass = strongEncoder.encode(password);
    String weakEncodedPass = weakEncoder.encode(password);

    //Prints true
    System.out.println(weakEncoder.matches(password, strongEncodedPass)); 
    //Prints true
    System.out.println(strongEncoder.matches(password, weakEncodedPass)); 
}

由于编码器使用不同的工作负载,两个打印语句不应该导致错误吗?

以上示例在 Java 8 中使用 spring-security-core-4.1.0.RELEASE.jar 进行了测试

【问题讨论】:

    标签: java spring spring-security bcrypt


    【解决方案1】:

    如果您查看有关 BCrypt (https://en.wikipedia.org/wiki/Bcrypt) 的维基百科文章,您会注意到哈希的格式包含轮数

    例如影子密码记录$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy指定cost参数为10,表示210个密钥扩展轮次。盐是 N9qo8uLOickgx2ZMRZoMye,生成的哈希是 IjZAgcfl7p92ldGxad68LJZdL17lhWy。

    因此,当验证密码是否与哈希匹配时,它的哈希次数与原始哈希相似。

    换句话说:matches() 独立于设置,可能是静态的...

    【讨论】:

      【解决方案2】:

      阅读源码,强度只在生成salt时使用。加密算法本身使用的轮数被硬编码为 16。

      所以你看到的是预期的。不过,不确定为什么 Spring 不允许为加密部分选择多轮。可能值得在错误/功能请求中发出信号,因为文档确实令人困惑。

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 2021-03-20
        • 2020-05-26
        • 2019-03-25
        • 2016-01-23
        • 2015-05-09
        • 1970-01-01
        • 2021-12-12
        • 2012-01-17
        相关资源
        最近更新 更多