Spring上Bcrypt实现的可能错误

时间:2019-01-25 08:52:58

标签: java spring-security bcrypt

我正在测试将密码哈希从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));


    }

...

1 个答案:

答案 0 :(得分: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之前以某种方式对密码进行哈希处理(在安全站点上询问如何安全地执行此操作)。