SDDL 格式的 SID 的最大长度是多少

问题描述 投票:0回答:5

我正在将 Active Directory 身份验证构建到我的应用程序中,并计划将我的应用程序的内部帐户链接到用户的域 SID。 对我来说,使用 sid 的字符串格式比使用字节数组更容易,因此我计划将其作为字符串存储在数据库中。 我应该将该字段设置多长时间才能确保 SID 不会被截断?

authentication active-directory sid
5个回答
35
投票

我也有同样的问题,我相信正确的答案是:

  • ID 作为字符串:184 个字符,或 SQL Server 中的 varchar(184)
  • SID 作为十六进制数字字符串:136 个字符,或 SQL Server 中的 varchar(136)
  • SID 为二进制:68 字节,或 SQL Server 中的 varbinary(68)

我自己没有检查过数学,但这里使用的技术看起来是有效的: https://groups.google.com/d/msg/microsoft.public.dotnet.security/NpIi7c2Toi8/31SVhcepY58J

参考Russell Mangel于2006年8月19日写的程序,也复制在这里供参考:

所以我的问题的答案是:

varbinary(68)——纯二进制
varchar(136) -- (68*2) = 十六进制字符串
varchar(184) -- SID 字符串

我写了一个小程序来测试, 请注意 .NET 2.0 有 安全标识符.MaxBinaryLength,I 不知道这个。

Console.WriteLine("SID Min. num Bytes: {0}",
SecurityIdentifier.MinBinaryLength);
Console.WriteLine("SID Max. num Bytes: {0}",
SecurityIdentifier.MaxBinaryLength);
Byte[] bytes = new byte[SecurityIdentifier.MaxBinaryLength];
for (Int32 i = 0; i < bytes.Length; i++)
{
    bytes[i] = 0xFF;
}
bytes[0] = 0x01; // Must be 1
bytes[1] = 0x0F; // Max 15 (base10)
SecurityIdentifier sid = new SecurityIdentifier(bytes, 0);
String sidString = sid.ToString();
Console.WriteLine("Max length of SID in String format: {0} ", sidString.Length);
Console.WriteLine(sidString);

结果

SID Min. num Bytes: 8
SID Max. num Bytes: 68
Max length of SID in String format: 184
S-1-281474976710655-4294967295-4294967295-4294967295-4294967295-4294967295-
  4294967295-4294967295-4294967295-4294967295-4294967295-4294967295-
  4294967295-4294967295-4294967295-4294967295 

2
投票

根据ntseapi_x.h:

typedef struct _SID_IDENTIFIER_AUTHORITY {
    UCHAR Value[6];
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY; 

typedef struct _SID {
   UCHAR Revision;
   UCHAR SubAuthorityCount;
   SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
   ULONG SubAuthority[ANYSIZE_ARRAY];
} SID, *PISID;
    
#define SID_MAX_SUB_AUTHORITIES          (15)

A UCHAR 实际上是一个 unsigned char,它是 1 个字节。 ULONG 是一个 unsigned long,为 4 个字节。

SID 的最大数据大小为 68 字节:UCHAR + UCHAR + (UCHAR * 6) + (ULONG * 15) = 1 + 1 + 6 + 60 = 68

将 SID 转换为字符串,就像通过调用 ConvertSidToStringSid 获得的结果一样,可能如下所示:L"S-1-5-21-66"

  • “S-1”<= is the start of all SIDs
    • 3个字符
  • “5”<= is the identifier authority
    • 数字通常以小数形式打印。 一个例外是,如果权限大于 4 个字节,则将其打印为十六进制,例如。 0x1234...
    • 所以最大值将为“4294967296”或“0xffffffffffff”或14个字符
  • “21”和“66”<= are sub-authrities
    • 每个最多可以是“4294967296”或10个字符,最多有15个子权限
  • 各个部分由“-”分隔

SID 的最大字符串长度为 184:3 + 1 + 14 + 1 + (10 * 15) + 14 = 183,或 184 计算空值。

您可以考虑仅使用 MAX_UNICODE_STACK_BUFFER_LENGTH 或 256,它非常适合内存。


1
投票
  1. 对于字符串格式,常见的答案184是不正确的。 如果权限在 32 到最大 48 位之间,则必须将其表示为十六进制字符串,而不是十进制,并在前面添加“0x”。 这意味着您实际上需要 (48 位/4 位 + 2) 14 个字符的字符串,而不是表示十进制最大 48 位所需的 15 个字符的字符串,这意味着整个需要 (184 - 15 + 14) 183 个字符SID 字符串。 对于小于 32 位,使用十进制格式(最多 10 个十进制字符)。

1
投票

虽然 184 看起来是正确的,但在官方文档上有一个不同的值:

SID - 指定域帐户的安全标识符。 SID 是一个最大长度为 256 个字符的字符串。

https://learn.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/microsoft-windows-shell-setup-offlineuseraccounts-offlinedomainaccounts-offlinedomainaccount-sid#:~:text=SID%20is %20a%20string%20with%20a%20maximum%20length%20of%20256%20characters.


0
投票

在winnt.h中,有一个带有注释的宏,基本上说答案是187个字符

// 2 (S-)
// 4 (Rev(max: 255)-)
// 15 (
//      If (Auth < 2^32): Auth(max:4294967295)-
//      Else:             0xAuth(max:FFFFFFFFFFFF)-
//    )
// (11 * SID_MAX_SUB_AUTHORITIES) (SubN(max:4294967295)-)
// 1 (NULL character)
// = 187 (assuming SID_MAX_SUB_AUTHORITIES = 15)
#define SECURITY_MAX_SID_STRING_CHARACTERS \
    (2 + 4 + 15 + (11 * SID_MAX_SUB_AUTHORITIES) + 1)
© www.soinside.com 2019 - 2024. All rights reserved.