为什么 ASP.Identy 使用 Base32 对 SecurityStamp 进行编码(内部实现)

Cia*_*zka 5 security asp.net-identity asp.net-core

我正在考虑使用 Base64 将 SecurityStamp 存储在我的用户聚合中。在进入陷阱之前,我试图理解 ASP 团队选择使用 Base32 而不是简单地使用 Base64 的原因。

SecurityStamp 不是人类应该在请求中手动读取或传递的东西。我找不到添加内部 Base32 实现而不是使用现有 Base64 的任何明显优势。

private static string NewSecurityStamp()
    {
        byte[] bytes = new byte[20];
        _rng.GetBytes(bytes);
        return Base32.ToBase32(bytes);
    }
Run Code Online (Sandbox Code Playgroud)

https://github.com/dotnet/aspnetcore/blob/master/src/Identity/Extensions.Core/src/UserManager.cs#L2438

tim*_*mur 0

如果你看一下Base32 使用的字母表,你会发现它都是大写字母 和234567。这样做是为了专门减少传输代码时的人为错误(请参阅此 SO 答案中的更多背景)。

当您进一步检查UserManager源代码时,您会看到 被NewSecurityStamp引用,GenerateNewAuthenticatorKey我相信它的目的是提供人类可读的输出(例如,当您没有要扫描的二维码时设置 2FA)。