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

时间:2009-07-16 21:49:53

标签: authentication active-directory sid

我正在将Active Directory身份验证构建到我的应用程序中,并且我计划将应用程序的内部帐户链接到用户的域SID。我更容易使用sid的字符串格式而不是字节数组,所以我打算将它作为字符串存储在数据库中。我应该多长时间来确保SID不会被截断?

3 个答案:

答案 0 :(得分:31)

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

  • ID as string:184个字符,或SQL Server
  • 中的varchar(184)
  • SID为十六进制数字的字符串:136个字符,或SQL Server
  • 中的varchar(136)
  • SID as binary: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)= hexString
  varchar(184) - SID字符串

     

我写了一个小程序来测试,   注意到.NET 2.0有   SecurityIdentifier.MaxBinaryLength,我   我不知道这件事。

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 

答案 1 :(得分:0)

  1. 对于字符串格式,常见答案184不正确。如果权限在32位和最大48位之间,则必须将其表示为十六进制字符串,而不是十进制,并以'0x'开头。这意味着,实际上需要一个(48位/ 4位+ 2)14个字符串,而不是表示一个十进制最大48位的15个字符的字符串,这意味着(184-15 + 14)整个整数需要183个字符SID字符串。如果少于32位,则使用十进制格式(最多10个十进制字符)。

答案 2 :(得分:0)

根据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)

UCHAR 实际上是一个1字节的 unsigned char ULONG 是4个字节的 unsigned long

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

将SID转换为字符串,就像调用ConvertSidToStringSid所得到的一样,可能看起来像这样:L“ S-1-5-21-66”

  • “ S-1” <=是所有SID的开头
    • 3个字符
  • “ 5” <=是标识符授权
    • 数字通常以小数形式打印。一个例外是,如果授权大于4个字节,则将其打印为十六进制,例如。 0x1234 ...
    • 因此最大值将为“ 4294967296”或“ 0xffffffffffff”或14个字符
  • “ 21”和“ 66” <=是子身份验证
    • 每个最多可以包含“ 4294967296”或10个字符,最多具有15个子权限
  • 这些部分用“-”分隔

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

您可能会考虑只使用MAX_UNICODE_STACK_BUFFER_LENGTH或256,非常适合内存。