如何解决Spring Boot密码哈希与ASP.NET相同
我们有一个用ASP.NET编写的旧平台,现在我们正在使用Spring开发一个新平台。我们存在将用户从旧数据库迁移到新数据库的问题,因为密码是哈希值,并且我们在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);
}
我发现ASP.NET使用PBKDF2密码哈希算法,但是我无法解析Spring Boot中的正确设置,因此其工作原理与ASP.NET相同。
这是哈希密码之一:
ANsMMBK0E6d3rCacx2XInDtyN5nSt6NlSMBv6avJ3n0KxqgqkA8x+V31jCtCeon8cg==
在Internet上阅读时,第一个字节表示使用了哪个版本的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
但是我无法创建与上述格式 ASP.NET Identity版本2
相对应的Pbkdf2PasswordEncoder我已经尝试过了:
Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder("",1000,256);
encoder.setAlgorithm(Pbkdf2PasswordEncoder.SecretKeyFactoryAlgorithm.PBKDF2WithHmacSHA1);
encoder.setEncodeHashAsBase64(true);
但是encoder.matchers(rawPassword,"2wwwErQTp3esJpzHZcicO3I3mdK3o2VIwG/pq8nefQrGqCqQDzH5XfWMK0J6ifxy")
返回false。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。