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

来源:https://andrewlock.net/exploring-the-asp-net-core-identity-passwordhasher/#:~:text=ASP.NET%20Core%20Identity%20and%20password%20hashing&text=The%20app%20will%20create%20a,get%20the%20original%20password%20back

但是我无法创建与上述格式 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 (将#修改为@)