如何在 .NET Core 中哈希密码,使其与 .NET Framework 相等

9

我正在将使用 .Net Framework 4.5.2 的旧 API 迁移到 .Net Core 2.1,旧的 API 使用 .Net Framework 4.5.2,其中有这个脚本:

PasswordHasher hasher = new PasswordHasher();
password = ConfigurationManager.AppSettings["userDefaultPassword"].ToString();
hashedPassword = hasher.HashPassword(password);

我想知道,在.Net Core 2.1中是否有任何相等函数可产生与旧的.Net Framework相同的哈希结果?

1个回答

11

我认为等价物是这样的:

IConfiguration _configuration;
PasswordHasher<User> hasher = new PasswordHasher<User>(
    new OptionsWrapper<PasswordHasherOptions>(
        new PasswordHasherOptions() {
            CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV2
    })
);
password = _configuration["userDefaultPassword"].ToString();
hashedPassword = hasher.HashPassword(user, password);

注意:

  • 现在应该使用IConfiguration (Startup.cs中的Configuration),而不是ConfigurationManager
  • PasswordHasher现在将您的用户对象作为泛型参数(并在调用HashPassword时传递一个实例)。
  • 我已经指定了IdentityV2CompatibilityMode,因为听起来您想生成向后兼容的密码哈希(即,您可以从.NET Framework访问数据库并理解由.NET Core生成的哈希)。 如果不是这种情况,则可以将其删除,因为验证代码可以验证旧哈希而无需设置此选项。
  • OptionsWrapperMicrosoft.Extensions.Options命名空间下。

由于存在“CompatiblityMode”,如果我在非Windows服务器上部署API,这会起作用吗? - Sandy Rizky
兼容模式是.NET Core PasswordHasher的一个功能,所以如果它不起作用,我会非常惊讶(并直接前往GitHub报告错误)。请注意,这是与他们旧的哈希函数(在ASP.NET Identity V2中)的兼容性,与软件在Windows下运行的任何兼容性模式无关,如果您正在考虑这个? - ProgrammingLlama
对不起,我刚才误解了“兼容性”的意思。现在在尝试您的代码后,我得到了这个错误:“无法将Microsoft.AspNetCore.Indentity.PasswordHasherOption转换为Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Indentity.PasswordHasherOption>”。 - Sandy Rizky
我的错,我漏掉了一些东西。请使用更新后的代码尝试。 :-) - ProgrammingLlama
提供“用户”给密码哈希器有什么意义?我检查了验证我的哈希值,只有在我更改存储的哈希值和/或提供的密码时才会失败。玩弄用户名似乎不会影响验证算法。我错过了什么吗? - Konrad Viltersten
@Konrad 生成的哈希值是有版本号的,因此可能是为了防止微软将其他用户数据合并到哈希值中而存在的。 - ProgrammingLlama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接