Как правильно передать ключ для шифрования в ASP.NET Core?
У меня усть Web API, где используется RSA для шифрования некоторых данных. Подскажите, как грамотно передать ключ в API, что бы это было надёжно и секьюрно? В текущей реализации, ключ передаётся, в виде файлика .pem а путь к нему, указывается в конфиг файле.
Мне кажется что этот подход крайне не верен с точки зрения реализации, хотелось бы узнать best practices, как решаются подобные задачи?
Ответы (1 шт):
Вообще часто такие данные хранятся в Хранилище секретов 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 });
}