Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从BCryptPasswordEncoder获取原始密码_Java_Spring_Passwords_Bcrypt - Fatal编程技术网

Java 如何从BCryptPasswordEncoder获取原始密码

Java 如何从BCryptPasswordEncoder获取原始密码,java,spring,passwords,bcrypt,Java,Spring,Passwords,Bcrypt,我正在为我的应用程序使用spring安全性。当用户第一次注册时,他们的密码将使用BCryptPasswordEncoder加密 BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String hashedPassword = passwordEncoder.encode(password); 现在,在密码更改的情况下,用户输入其当前密码,我需要检查当前密码是否与数据库中保存的加密密码相同 我知道用BCryp

我正在为我的应用程序使用spring安全性。当用户第一次注册时,他们的密码将使用
BCryptPasswordEncoder
加密

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(password);
现在,在密码更改的情况下,用户输入其当前密码,我需要检查当前密码是否与数据库中保存的加密密码相同

我知道用
BCryptPasswordEncoder
生成两个相同字符串的相同加密哈希是不可能的。因此,如果密码相同,比较密码的唯一方法可能是获取保存在数据库中的原始密码,并与当前输入的密码进行比较


那么,有没有办法比较密码或从数据库中获取原始密码保存的哈希密码

您只需对照数据库中的编码密码检查原始密码。比如说,

BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String p = bCryptPasswordEncoder.encode("SomeCoolPassword");
System.out.println(bCryptPasswordEncoder.matches("SomeCoolPassword", p));

是的,
passwordEncoder
不会创建相同的散列,但是您可以比较它们,如果它是从相同的字符串生成的,它将返回true。请看我的例子:

public class Test {
    public static void main(String[] args) {
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        List<String> passwords = Arrays.asList(bCryptPasswordEncoder.encode("testPassword"),
                bCryptPasswordEncoder.encode("testPassword"),
                bCryptPasswordEncoder.encode("testPassword"),
                bCryptPasswordEncoder.encode("testPassword"));

        passwords.stream()
                .filter(e -> bCryptPasswordEncoder.matches("testPassword", e))
                .forEach(e -> System.out.println(true));
    }
公共类测试{
公共静态void main(字符串[]args){
BCryptPasswordEncoder BCryptPasswordEncoder=新的BCryptPasswordEncoder();
List passwords=Arrays.asList(bCryptPasswordEncoder.encode(“testPassword”),
bCryptPasswordEncoder.encode(“testPassword”),
bCryptPasswordEncoder.encode(“testPassword”),
bCryptPasswordEncoder.encode(“testPassword”);
passwords.stream()
.filter(e->bCryptPasswordEncoder.matches(“testPassword”,e))
.forEach(e->System.out.println(true));
}
}


我得到了4个
true

很好的解决方案,但在我的例子中,它真的很慢。如果使用这种密码验证方式(anywhery、dorin'login'等),这种验证占用了整个执行时间的84%(!!!)(使用探查器进行测试),则需要以某种方式进行改进。(当然,bcrypt在设计上很慢,但看起来该检查没有优化)@AlexEfimov,我希望看到实际时间和配置,而不是总执行时间的%。原因是,84%相对不重要的时间也是不重要的。诚然,这项特定任务的速度很慢,但性能和安全性是对立的力量/需求,您的特定需求可能需要进行麻烦的权衡。我在一些网络应用程序中使用了这段代码进行登录,但没有遇到任何问题。问题是“如何获得原创”,而不是“如何比较”。我不知道为什么人们喜欢回答非固定问题。@parzival,我不理解这个问题。是的,标题是“如何从BCryptPasswordEncoder获取原始密码”,但问题的内容包括“那么,有没有办法比较密码或从数据库中获取原始密码保存的哈希密码?”此外,op也接受了这一点,所以我认为查看整个帖子很重要。