预测 UserManager.GenerateUserTokenAsync 个令牌的长度(通过 DataProtectorTokenProvider)
Predicting length of UserManager.GenerateUserTokenAsync tokens (via DataProtectorTokenProvider)
我正在使用 ASP.NET Core 3.1,其中一些自定义逻辑重用了 ASP.NET Core Identity 的 UserManager<TUser>
class。我想重用它对 GenerateUserTokenAsync(...)
的能力,例如也使用了相同类型的令牌。电子邮件确认。对于我的应用程序,我需要知道生成的令牌的最大长度。
我做了以下研究:
UserManager<TUser>.GenerateUserTokenAsync(...)
calls GenerateAsync
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
ed 然后转换 ToBase64String
当我在本地机器上随意测试时,我得到了一个 352 个字符的加密字符串。我怎么能预测119个输入字符加密后会变成352个字符呢?更糟糕的是,我的应用程序实际上在 Azure 应用程序服务的生产环境中运行,其中 Azure 的 DPAPI 应该启动,可能使用与本地主机不同的加密方式?
我能否以任何方式预测生成的用户令牌在 Azure 应用服务上的最大长度?我很乐意包含误差范围,但我不知道那需要什么。
默认情况下,DPAPI 使用 AES-256-CBC 作为加密算法,除非您通过 UseCryptographicAlgorithms 更改它。根据默认算法,您的情况的计算方式如下:
因为它是 AES 256,所以它适用于 32 字节的块。因此,使用 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 因为应用服务的每个实例都需要指向相同的密钥。
我正在使用 ASP.NET Core 3.1,其中一些自定义逻辑重用了 ASP.NET Core Identity 的 UserManager<TUser>
class。我想重用它对 GenerateUserTokenAsync(...)
的能力,例如也使用了相同类型的令牌。电子邮件确认。对于我的应用程序,我需要知道生成的令牌的最大长度。
我做了以下研究:
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
ed 然后转换ToBase64String
当我在本地机器上随意测试时,我得到了一个 352 个字符的加密字符串。我怎么能预测119个输入字符加密后会变成352个字符呢?更糟糕的是,我的应用程序实际上在 Azure 应用程序服务的生产环境中运行,其中 Azure 的 DPAPI 应该启动,可能使用与本地主机不同的加密方式?
我能否以任何方式预测生成的用户令牌在 Azure 应用服务上的最大长度?我很乐意包含误差范围,但我不知道那需要什么。
默认情况下,DPAPI 使用 AES-256-CBC 作为加密算法,除非您通过 UseCryptographicAlgorithms 更改它。根据默认算法,您的情况的计算方式如下:
因为它是 AES 256,所以它适用于 32 字节的块。因此,使用 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 因为应用服务的每个实例都需要指向相同的密钥。