Шифруется ли SecureString в .NET 5 и .NET Core в Windows?

Microsoft пишет в своей документации по SecureString [1]:

В операционной системе Windows содержимое внутреннего массива символов экземпляра SecureString шифруется.

С другой стороны, в Microsoft github repo[2] написано:

Содержимое массива не зашифровано, за исключением .NET Framework.

Поэтому мне интересно, какое утверждение верно. Шифруется ли SecureString на основе операционной системы Windows (.NET Framework и .NET Core) или шифруется только в .NET Framework. Как обрабатывается шифрование SecureString для .NET 5?

[1] https://docs.microsoft.com/en-us/dotnet/api/system.security.securestring?view=netcore-3.0

[2] https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md


person tux1337    schedule 05.03.2021    source источник
comment
поскольку оба источника рекомендуют не использовать SecureString - имеет ли это значение?   -  person Franz Gleichmann    schedule 05.03.2021
comment
К сожалению, иногда нет возможности избежать паролей для аутентификации. Поэтому элегантной альтернативы SecureString я не вижу.   -  person tux1337    schedule 05.03.2021
comment
подумайте об этом: если кто-то имеет доступ к вашей системной памяти, он также имеет доступ к зашифрованному паролю. и ключ расшифровки. и любую комбинацию учетных данных, которую вы отправляете в другую систему. и все остальное. я сомневаюсь, что существует более чем несколько пограничных случаев, когда SecureString может значительно повысить безопасность.   -  person Franz Gleichmann    schedule 05.03.2021
comment
это правда, тем не менее в конкретном случае это лучше, чем хранить пароль в виде строки. Так что ответ на вопрос будет высоко оценен.   -  person tux1337    schedule 05.03.2021
comment
Вы можете посмотреть исходный код github.com/ Майкрософт/референсисходник/блоб/мастер/mscorlib/   -  person Klaus Gütter    schedule 05.03.2021


Ответы (2)


SecureString зашифрован в .NET 5+ и в .NET Core, работающем в Windows.

Из документация по .NET 5< /а>:

В операционной системе Windows содержимое внутреннего массива символов экземпляра SecureString зашифровано.

Однако эту страницу лучше всего читать целиком.

То же предложение находится в Документация по .NET Core, как для .NET Core 3.0, так и для 2.0.


Microsoft рекомендует хранить секреты за пределами процесса и использовать непрозрачные дескрипторы для доступа к ним, что предпочтительнее использования SecureString. Другими словами, основной смысл использования SecureString заключается в закреплении и максимально короткой продолжительности хранения секрета в памяти процесса в любой форме, а не в шифровании. Короткая продолжительность живого хранения, конечно же, является обязанностью разработчика, а не самой SecureString.

Некоторые случаи использования, когда шифрование SecureString может обеспечить полезную глубокую защиту, — это когда секрет поступает небольшими порциями, относительно быстро (например, во время ввода пароля с клавиатуры) и когда можно быстро использовать SecureString (например, re-protected и хранится где-то еще) и удаляется сразу после получения последнего бита секрета. Напротив, копирование ранее существовавшего String в SecureString в цикле всегда довольно бессмысленно: вы все равно собираетесь очень скоро избавиться от SecureString, а секрет уже перенесен в незакрепленную управляемую память, поэтому его копии в виде простого текста могут жить в процессе навсегда, даже после того, как вы избавитесь от файла SecureString.

person Jirka Hanika    schedule 03.06.2021

В источнике SecureString есть метод EncryptionSupported (см. ниже), который в сочетании с методом CheckSupportedOnCurrentPlatform проверяет, поддерживается ли шифрование, в противном случае выдается исключение.

Мне кажется, что SecureString поддерживается в Windows, если только он не работает на .NET Core или .NET Framework.

https://github.com/microsoft/referencesource/blob/master/mscorlib/system/security/securestring.cs

    [System.Security.SecurityCritical]  // auto-generated
        unsafe static bool EncryptionSupported() {
            // check if the enrypt/decrypt function is supported on current OS
            bool supported = true;                        
            try {
                Win32Native.SystemFunction041(
                    SafeBSTRHandle.Allocate(null , (int)Win32Native.CRYPTPROTECTMEMORY_BLOCK_SIZE),
                    Win32Native.CRYPTPROTECTMEMORY_BLOCK_SIZE, 
                    Win32Native.CRYPTPROTECTMEMORY_SAME_PROCESS);
            }
            catch (EntryPointNotFoundException) {
                supported = false;
            }            
            return supported;
        }


     private void CheckSupportedOnCurrentPlatform() {
            if( !supportedOnCurrentPlatform) {
                throw new NotSupportedException(Environment.GetResourceString("Arg_PlatformSecureString"));
            }                            
            Contract.EndContractBlock();
        }
person tux1337    schedule 29.03.2021
comment
Этот ответ, кажется, говорит о том, что SecureString не шифрует в .NET Framework. Я не знаю о .NET 5 в Windows, но я уверен, что SecureString действительно шифрует в .NET Framework. - person Jirka Hanika; 02.06.2021