我正在使用 ASP.NET Core 3.1,以及一些重用 ASP.NET Core Identity 的 UserManager<TUser>
的自定义逻辑。类(class)。我想重用它的能力GenerateUserTokenAsync(...)
,相同类型的 token 也用于例如电子邮件确认。出于我的应用程序的目的,我需要知道生成的 token 的最大长度。
我做了以下研究:
UserManager<TUser>.GenerateUserTokenAsync(...)
callsGenerateAsync
on the injected provider就我而言,这是
DataProtectorTokenProvider<TUser>
这将 generate tokens like this :var ms = new MemoryStream(); var userId = await manager.GetUserIdAsync(user); using (var writer = ms.CreateWriter()) { writer.Write(DateTimeOffset.UtcNow); writer.Write(userId); writer.Write(purpose ?? ""); string stamp = null; if (manager.SupportsUserSecurityStamp) { stamp = await manager.GetSecurityStampAsync(user); } writer.Write(stamp ?? ""); } var protectedBytes = Protector.Protect(ms.ToArray()); return Convert.ToBase64String(protectedBytes);
因此内存流长度的基本计算是:
27 characters for DateTimeOffset.UtcNow 36 characters for the user id (string representation of a GUID) 20 characters for my specific "purpose" string 36 characters for the security stamp (string representation of a GUID) ---- + 119 characters in total
在代码片段中,得到
Protect
编辑然后转换ToBase64String
当我在本地计算机上随意测试时,我得到了一个 352 个字符的加密字符串。我如何预测 119 个输入字符加密后会变成 352 个字符?更糟糕的是,我的应用程序实际上在生产环境中运行在 Azure 应用服务上,其中 Azure 的 DPAPI应该启动,可能使用与本地主机不同的加密?
我能否以任何方式预测 Azure 应用服务上生成的用户 token 的最大长度是多少?我很乐意包含一定的误差范围,但我不知道这需要什么是。
最佳答案
默认情况下,DPAPI 使用 AES-256-CBC 作为加密算法,除非您通过 UseCryptographicAlgorithms 更改它。根据默认算法,对于您的情况,计算将如下所示:
由于它是 AES 256,因此它可以使用 32 字节 block 。因此,使用 CBC 填充,输出变为 ((119/32) + 1) * 32 + 16 (IV) = 144。经过 base64 后,它变为 192。
那么,352 会带来一个问题,在你的情况下,邮票真的是 36 吗?
36 characters for the security stamp (string representation of a GUID)
此外,在部署环境中,请确保store data protection key outside app因为应用服务的每个实例都需要指向相同的 key 。
关于c# - 预测 UserManager.GenerateUserTokenAsync token 的长度(通过 DataProtectorTokenProvider),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62760060/