Как правильно передать ключ для шифрования в ASP.NET Core?

У меня усть Web API, где используется RSA для шифрования некоторых данных. Подскажите, как грамотно передать ключ в API, что бы это было надёжно и секьюрно? В текущей реализации, ключ передаётся, в виде файлика .pem а путь к нему, указывается в конфиг файле.

Мне кажется что этот подход крайне не верен с точки зрения реализации, хотелось бы узнать best practices, как решаются подобные задачи?


Ответы (1 шт):

Автор решения: air2921

Вообще часто такие данные хранятся в Хранилище секретов ASP.NET Core, а не в отдельных файлах на сервере.

https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-8.0&tabs=windows

Если лень читать доку, то вот так это делается:

Открываем cmd там указываем папку с Web API проектом, в этой папке должен находится файл .csproj Примерно вот так это выглядит:

cd C:\Users\User\source\repos\Проект\webapi

Далее вводим команду для инициализации хранилища:

dotnet user-secrets init

После этого вы можете сохранять ваши секреты в этом хранилище:

dotnet user-secrets set "Ключ" "Значение секрета"

После инициализации хранилища, и добавления секретов, настраиваете свой IСonfiguration на работу с хранилищем секретов:

IConfiguration configuration = new ConfigurationBuilder()
    .AddUserSecrets<Тут обычно Program/Startup>()
    .Build();

Теперь в контроллере, или любом другом месте вашего приложения где нужен ключ, получаем его:

Инициализуем нужные поля:

private readonly IConfiguration _configuration;
private readonly string secretKey;

Теперь в конструкторе класса:

public ВашКласс(IСonfiguration configuration)
{
    _configuration = configuration;
    secretKey = _configuration["Ключ под которым сохранен ваш секрет"];
}

Если ключ представляет из себя массив байтов закодированный в Base64String (Что очень даже распространенно для ключей шифрования), то можно немного модифицировать получение ключа:

Также инициализуем поле для ключа, только уже типа byte[]:

private readonly byte[] secretKey;

И в конструкторе класса, при получении добавим метод для конвертации значения в массив байтов:

public ВашКласс(IСonfiguration configuration)
{
    _configuration = configuration;
    secretKey = Convert.FromBase64String(_configuration["Ключ под которым сохранен ваш секрет"]);
}

Теперь этот ключ можно использовать в любом месте класса где он "инжектирован"

public IActionResult GetKey()
{
    return StatusCode(200, new { secretKey });
}
→ Ссылка