Spring启动密码哈希与ASP.NET相同
我们使用ASP.NET编写了旧的平台,现在我们正在使用Spring开发新的平台。我们在将用户从旧数据库迁移到新数据库时遇到问题,因为密码是散列的,我们在春季使用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
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);