为什么身份框架核心哈希密码的开头都相同?

Cha*_*ase 5 c# hash asp.net-identity .net-core

我正在构建一个使用 dotnet core API 和身份核心进行用户管理的应用程序。我正在调查我的数据库,当我看到该字段中的所有字符串都PasswordHash以相同的字符开头时感到惊慌:AQAAAAEAACcQAAAAE,因为我认为加盐无法正常工作。我现在意识到加盐确实可以正常工作,因为密码散列的其余部分随每个密码而变化,但现在我对这个神秘的前缀感到好奇。

这个密码哈希前缀在身份核心中有何用途?

Don*_*a4e 3

根据实现,Microsoft.AspNetCore.Identity 使用以下格式生成结果值(版本 3 的实际格式):


标头

A)字节#0:格式版本(0x00 表示版本 2,0x01 表示版本 3)

B)字节#1-4:int(4 字节),KeyDerivationPrf Enum - 密钥派生算法。V3 中的 HMACSHA256,自 .NET7 以来的 HMACSHA512

C)字节#5-8:int(4 字节),迭代计数。V3 中为 10000,自 .NET7 以来为 100k

D)字节#9-12:int(4 字节),salt 长度。V3 中 16 个


身体

E)字节#13-28 - 盐。(长度取自标头 D)

F)字节 #29-60 - 哈希(标头 B 处的 HMACSHA256 表示它有 256/8 = 32 字节长度)


结果字节数组以 BASE64 格式存储


显然,由于所有 V3 哈希值的 header 都相同,因此所有 V3 哈希值的开头都将具有相同的字符(61 字节中的前 13 个字节)。