Какова максимальная длина SID в формате SDDL?

Я встраиваю аутентификацию Active Directory в свое приложение и планирую связать внутренние учетные записи моего приложения с SID домена пользователя. Мне проще работать со строковым форматом sid, чем с байтовым массивом, поэтому я планировал хранить его в базе данных как строку. Как долго я должен делать поле, чтобы гарантировать, что SID не будут усечены?


person Brian Cauthon    schedule 16.07.2009    source источник


Ответы (3)


У меня был тот же вопрос, и я считаю, что правильный ответ:

  • ID в виде строки: 184 символа или varchar(184) в SQL Server.
  • SID в виде строки шестнадцатеричных цифр: 136 символов или varchar (136) в SQL Server.
  • SID в двоичном виде: 68 байт или varbinary(68) в SQL Server.

Я сам не проверял математику, но использованная здесь методика выглядит корректной: https://groups.google.com/d/msg/microsoft.public.dotnet.security/NpIi7c2Toi8/31SVhcepY58J

Обратитесь к программе, написанной Расселом Мангелем 19 августа 2006 г., также скопированной здесь для справки:

Итак, ответ на мой вопрос:

varbinary(68) -- pure binary
varchar(136) -- (68*2) = hexString
varchar(184) -- SID String

Я написал небольшую программу для тестирования, обратите внимание, что .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 
person Emil Lerch    schedule 24.11.2009
comment
Можете ли вы объяснить, почему SQL SUSER_SID возвращает VARBINARY (85), а не (68)? - person filimonic; 19.05.2020

  1. Для строкового формата общий ответ 184 неверен. Если полномочия находятся между 32 и максимум 48 битами, то они должны быть представлены в виде шестнадцатеричной строки, а не десятичной, и начинаться с «0x». Это означает, что вместо 15-символьной строки, необходимой для представления максимальных 48 битов в десятичном виде, вам на самом деле нужна (48-битная / 4-битная + 2) 14-символьная строка, то есть (184 - 15 + 14) 183 символа требуются для всего. SID-строка. Для менее чем 32 бит используется десятичный формат (максимум 10 десятичных символов).
person Chalky    schedule 31.12.2018
comment
Интересно, что даже некоторые из собственных кодов MS не учитывают этого. Конструктор .NET Security.Principal.SecurityIdentifier принимает шестнадцатеричный формат, но метод ToString() всегда выводит в десятичном формате. - person Chalky; 31.12.2018

Согласно 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 байт. ULONG — это длинное без знака, равное 4 байтам.

Максимальный размер данных SID — 68 байт: UCHAR + UCHAR + (UCHAR * 6) + (ULONG * 15) = 1 + 1 + 6 + 60 = 68.

Преобразование SID в строку, подобное тому, что вы получили бы, вызвав ConvertSidToStringSid может выглядеть примерно так: LS-1-5-21-66

  • "S-1" <= is the start of all SIDs
    • 3 characters
  • "5" <= is the identifier authority
    • the numbers are printed as decimals normally. One exception is if the authority is larger 4 bytes, then it is printed as hex, eg. 0x1234...
    • Таким образом, максимальное значение будет 4294967296 или 0xffffffffffff или 14 символов.
  • "21" & "66" <= are sub-authrities
    • Each can be up "4294967296" or 10 characters, with 15 max sub authorities
  • разделы разделены символом -

Максимальная длина строки SID составляет 184: 3 + 1 + 14 + 1 + (10 * 15) + 14 = 183, или 184, считая нуль.

Вы можете просто использовать MAX_UNICODE_STACK_BUFFER_LENGTH или 256, что хорошо вписывается в память.

person sam msft    schedule 18.11.2020