编程语言
首页 > 编程语言> > PHP和Java在bcrypt加密算法实现上的差异

PHP和Java在bcrypt加密算法实现上的差异

作者:互联网

背景:

PHP的bcrypt默认采用的是CRYPT_BLOWFISH加密算法,使用的salt是$2y$,而Java使用的salt是$2a$,当使用Java对由PHP的bcrypt加密的密文进行校验时,会因为salt的这个差异导致Java出现下面的错误:

Encoded password does not look like BCrypt

从官方文档对CRYPT_BLOWFISH的说明里,可以证实:

解决办法,分为两种:

第一种,也是最简单的,在密文校验前,先将密文的$2y$替换为$2a$

第二种,重写spring boot的BCryptPasswordEncoder.java,之所以会出现上述错误,主要是下面这个方法:

    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        if (encodedPassword == null || encodedPassword.length() == 0) {
            logger.warn("Empty encoded password");
            return false;
        }

        if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
            logger.warn("Encoded password does not look like BCrypt");
            return false;
        }

        return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
    }

 

 

参考资料:

https://www.php.net/manual/en/function.crypt.php

标签:encodedPassword,return,2y,2a,Java,PHP,salt,加密算法
来源: https://www.cnblogs.com/jamstack/p/16194328.html