Spring启动密码哈希与ASP.NET相同

Spring启动密码哈希与ASP.NET相同,asp.net,spring,password-hash,Asp.net,Spring,Password Hash,我们使用ASP.NET编写了旧的平台,现在我们正在使用Spring开发新的平台。我们在将用户从旧数据库迁移到新数据库时遇到问题,因为密码是散列的,我们在春季使用BCryptPasswordEncoder类,但ASP.NET使用不同的格式:PBKDF2 因此,我查看了互联网,发现Spring有一个DelegatePasswordEncoder类,它将encode()和matches()操作委托给特定的PasswordEncoder,只要密码哈希以以下格式存储: {bcrypt}$2a$10$qAs

我们使用ASP.NET编写了旧的平台,现在我们正在使用Spring开发新的平台。我们在将用户从旧数据库迁移到新数据库时遇到问题,因为密码是散列的,我们在春季使用
BCryptPasswordEncoder
类,但ASP.NET使用不同的格式:PBKDF2

因此,我查看了互联网,发现Spring有一个
DelegatePasswordEncoder
类,它将
encode()
matches()
操作委托给特定的
PasswordEncoder
,只要密码哈希以以下格式存储:

{bcrypt}$2a$10$qAsa6m....
{pbkdf2}AGgeSLwBUQe8p....
并为DelegatePasswordEncoder提供bean,如下所示:

@Bean
public PasswordEncoder getPasswordEncoder() {
    Map<String, PasswordEncoder> encoders = new HashMap<>();
    encoders.put("bcrypt", new BCryptPasswordEncoder());
    encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
    return new DelegatingPasswordEncoder("bcrypt", encoders);
}
在互联网上阅读,第一个字节表示使用的是什么版本的PBKDF2,但是通过
Pbkdf2PasswordEncoder
类的源代码来看,没有实现这样的功能。 好消息是,所有密码散列都以字母“A”开头,或
0x00
,这意味着ASP.NET中使用的格式是:

ASP.NET Identity Version 2: PBKDF2 with HMAC-SHA1, 128-bit salt, 256-bit subkey, 1000 iterations
因此,由于Spring的
Pbkdf2PasswordEncoder
不支持标记格式,我可以从散列的开头删除
0x00
,剩下的散列如下:

2wwwErQTp3esJpzHZcicO3I3mdK3o2VIwG/pq8nefQrGqCqQDzH5XfWMK0J6ifxy
来源:

但是,我无法创建与上述格式相对应的Pbkdf2PasswordEncoderASP.NET Identity Version 2

我试过这个:

Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder("", 1000, 256);
encoder.setAlgorithm(Pbkdf2PasswordEncoder.SecretKeyFactoryAlgorithm.PBKDF2WithHmacSHA1);
encoder.setEncodeHashAsBase64(true);
但是
encoder.matchers(rawPassword,“2wwwErQTp3esJpzHZcicO3I3mdK3o2VIwG/PQ8NEFQRGQCQDZH5XFWMK0J6IFXY”)
返回false

Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder("", 1000, 256);
encoder.setAlgorithm(Pbkdf2PasswordEncoder.SecretKeyFactoryAlgorithm.PBKDF2WithHmacSHA1);
encoder.setEncodeHashAsBase64(true);