【问题标题】:Possible bug with Bcrypt implementation on Spring [duplicate]Spring上Bcrypt实现的可能错误[重复]
【发布时间】:2019-06-19 02:01:35
【问题描述】:

我正在测试将我们的密码哈希从 sha-256 移动到 sha-512 或 bcrypt。为此,我实现了一个非常简单的测试,但是我发现当 Bcrypt 尝试将其与相同的 rawPassword + 任何其他内容进行匹配时,使用特定的 rawPassword 会失败,返回 true 而不是 false。也许和编码有关,但我不确定。

... 



    @Test
    public void testEncodePassword() {
            final String rawPassword = "¡Oh envidia, raíz de infinitos males y carcoma de las virtudes!";

            PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

            String encodedPassword = passwordEncoder.encode(rawPassword);

            assertTrue(passwordEncoder.matches(rawPassword,encodedPassword));
            assertFalse(passwordEncoder.matches("dds",encodedPassword));
            assertFalse(passwordEncoder.matches("dds"+rawPassword,encodedPassword));
            assertFalse(passwordEncoder.matches(rawPassword+"something else",encodedPassword));


    }

...

【问题讨论】:

  • 此测试通过 Spring Security 5.1。

标签: java spring-security bcrypt


【解决方案1】:

Bcrypt has a maximum password length of 72 (bytes)。 Java 使用 UTF-16 对字符串进行编码,因此您使用的密码长度约为 128 个字节:

>>> len("¡Oh envidia, raíz de infinitos males y carcoma de las virtudes!".encode('utf-16'))
128

如果您想支持更长的密码,请使用与 bcrypt 不同的密码,或者您必须在将密码输入 bcrypt 之前以某种方式对密码进行哈希处理(在安全网站上询问如何安全地执行此操作)。

【讨论】:

  • Spring Security 的 BCrypt 实现使用 UTF-8。
  • @holmis83 那么显然它的 lower 限制小于 72。72 是可能的最大值,但某些实现最多支持 50。无论哪种方式,问题都是密码长度
猜你喜欢
  • 2014-11-20
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 2019-09-23
  • 2010-10-26
  • 2014-10-12
  • 2021-01-11
相关资源
最近更新 更多