.NET Standard 2.0 и System.Security.Cryptography.ProtectedData.Protect

Я смотрю System.Security.Cryptography. ProtectedData.Protect @ https://docs.microsoft.com/en-gb/dotnet/api/

поскольку мы хотим перенести библиотеку из .NET Framework 4.7 в .NET Standard 2.0 для использования в .NET Core 2.0. Я провел поиск, и он доступен только в полной версии .NET Framework и .NET Core.

У меня вопрос, почему он недоступен в .NET Standard 2.0?

Я бы подумал, что если его можно использовать, например, в .NET Framework 4.7 и .NET Core 2.0, то он также будет частью .NET Standard 2.0.


person Noel    schedule 11.01.2018    source источник
comment
Потому что эта функция использует специфичные для Windows API и провайдеры. Он может быть доступен в пакете обеспечения совместимости Windows.   -  person Panagiotis Kanavos    schedule 11.01.2018


Ответы (3)


Этот API недоступен "в" .NET Standard 2.0, но доступен "для" .NET Standard 2.0 "как" расширение платформы ", что означает, что вы должны добавить пакет NuGet, чтобы получить для него поддержку.

Если вы добавите ссылку на пакет System.Security.Cryptography.ProtectedData NuGet, вы сможете разработать стандартную библиотеку .NET, которая использует эти API.

Однако эта поддержка работает только при запуске в Windows, поскольку эти API-интерфейсы описаны как

Предоставляет доступ к Windows Data Protection Api.

поэтому он не будет работать на платформах, отличных от Windows. В зависимости от ваших потребностей это может быть нормально.

Если вы хотите реализовать аналогичные концепции на нескольких платформах, я предлагаю изучить API защиты данных ASP.NET Core, которые также можно использовать вне контекста приложения ASP.NET Core, поскольку оно состоит из пакетов NuGet, которые обеспечивают криптографическую логику и решения для хранения ключей (например, каталог , хранилища сертификатов Windows, Azure KeyVault).

person Martin Ullrich    schedule 11.01.2018

ProtectedData использует DPAPI из Windows. Я создал библиотеку CrossProtectedData, которая использует ProtectedData в Windows и AspNetCore.DataProtection при работе не в Windows.

Для использования просто добавьте пакет NuGet CrossProtect и замените все вызовы ProtectedData на CrossProtect . Пример:

using Integrative.Encryption;
using System;
using System.Security.Cryptography;
using System.Text;

namespace CrossProtectedExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // our text to protect
            var text = "Hello!";

            // get bytes from text
            var bytes = Encoding.UTF8.GetBytes(text);

            // optional entropy
            var entropy = new byte[] { 100, 25, 31, 213 };

            // protect (encrypt)
            var protectedBytes = CrossProtect.Protect(bytes, entropy,
                DataProtectionScope.CurrentUser);

            // unprotect (decrypt)
            var unprotected = CrossProtect.Unprotect(protectedBytes, entropy,
                DataProtectionScope.CurrentUser);

            // convert bytes back to text
            var result = Encoding.UTF8.GetString(unprotected);

            // print result
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }
}
person cat_in_hat    schedule 11.01.2020
comment
Единственная обратная связь - просто использовать то же пространство имен, что и раньше, чтобы людям не приходилось менять код, в целом хорошая библиотека :) - person jjxtra; 17.12.2020

во-первых

Я не могу отвечать за майкрософт

tl;dr

На многие из этих вопросов можно ответить: если вам нужны API-интерфейсы, имеющиеся в .NET Framework, используйте .NET Framework.

Более длинный ответ в форме

Большое количество API, найденных в .NET Framework, либо полагаются на базовые библиотеки Windows (которые недоступны в MacO или дистрибутивах Linux), либо в настоящее время слишком сложны для реализации, как таковые, они недоступны для .NET Core.

Если вам нужен API, доступ к которому доступен только в .NET Framework, то (на данный момент) лучше использовать .NET Framework, а не .NET Core / Mono / и т. Д.

Если у вас есть веская причина для включения чего-либо в .NET Standard, я бы перешел к .NET Standard Репозиторий GitHub и попросите, чтобы он был там реализован.

person Jamie Taylor    schedule 11.01.2018