Я встраиваю аутентификацию Active Directory в свое приложение и планирую связать внутренние учетные записи моего приложения с SID домена пользователя. Мне проще работать со строковым форматом sid, чем с байтовым массивом, поэтому я планировал хранить его в базе данных как строку. Как долго я должен делать поле, чтобы гарантировать, что SID не будут усечены?
Какова максимальная длина SID в формате SDDL?
Ответы (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
- Для строкового формата общий ответ 184 неверен. Если полномочия находятся между 32 и максимум 48 битами, то они должны быть представлены в виде шестнадцатеричной строки, а не десятичной, и начинаться с «0x». Это означает, что вместо 15-символьной строки, необходимой для представления максимальных 48 битов в десятичном виде, вам на самом деле нужна (48-битная / 4-битная + 2) 14-символьная строка, то есть (184 - 15 + 14) 183 символа требуются для всего. SID-строка. Для менее чем 32 бит используется десятичный формат (максимум 10 десятичных символов).
Согласно 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, что хорошо вписывается в память.