Bushman.Secrets.Abstractions
1.0.0
See the version list below for details.
dotnet add package Bushman.Secrets.Abstractions --version 1.0.0
NuGet\Install-Package Bushman.Secrets.Abstractions -Version 1.0.0
<PackageReference Include="Bushman.Secrets.Abstractions" Version="1.0.0" />
paket add Bushman.Secrets.Abstractions --version 1.0.0
#r "nuget: Bushman.Secrets.Abstractions, 1.0.0"
// Install Bushman.Secrets.Abstractions as a Cake Addin #addin nuget:?package=Bushman.Secrets.Abstractions&version=1.0.0 // Install Bushman.Secrets.Abstractions as a Cake Tool #tool nuget:?package=Bushman.Secrets.Abstractions&version=1.0.0
Bushman.Secrets.Abstractions
Причина создания
В приложениях, написанных на .Net Framework, конфигурационные файлы обычно имеют формат XML. "Из коробки" эта платформа предоставляет возможность шифровать и расшифровывать секции в подобных файлах, дабы скрывать или отображать секреты: логины, пароли, строки подключения и URL различных сервисов.
Однако порой возникает необходимость хранить зашифрованные секреты и в других местах: в JSON-файлах конфигураций, в SQL базах данных, в записях CRM, в реестре Windows, а порой они могут понадобиться и в логах. Помимо этого, может возникать необходимость отправлять зашифрованные секреты по почте или через мессенджеры, а так же сохранять их в git-репозиториях (например, в составе конфигурационных файлов).
В приложениях, написанных на .NET (в отличии от .Net Framework), конфигурационные файлы обычно имеют
формат JSON. "Из коробки" эта платформа не предоставляет возможность шифровать и расшифровывать секции в таких
файлах. Вместо этого Microsoft рекомендует для хранения секретов использовать такие платные хранилища секретов,
как Azure Key Vault
или HashiCorp Vault
.
Пакет Bushman.Secrets.Abstractions
предоставляет абстрактную модель для создания, парсинга, шифрования, расшифровки
и распаковки секретов в тексте. Реализация этой абстрактной модели находится в пакете Bushman.Secrets
.
Все операции шифрования и расшифровки выполняются на основе сертификатов.
Для того, чтобы при запуске приложения в объектной модели конфигурационных настроек, представленной интерфейсами
Microsoft.Extensions.Configuration.IConfigurationRoot
или Microsoft.Extensions.Configuration.IConfiguration
выполнить распаковку всех секретов в памяти, можно использовать пакет Bushman.Extensions.Configuration.Secrets
,
в составе которого для интерфейса Microsoft.Extensions.Configuration.IConfiguration
определён метод расширения
ExpandSecrets()
(см. ниже раздел Распаковка секретов в настройках приложения).
О форме записи секретов
Секреты записываются в особом формате, позволяющем без проблем идентифицировать их в тексте. Каждый секрет может находиться в одном из двух состояний: в расшифрованном или зашифрованном.
При использовании пакета Bushman.Secrets
, JSON-файл с записанными в нём секретами как в качестве непосредственных значений (см. prop2
и prop4
), так и в составе произвольного текста (см. prop3
и prop5
), может выглядеть, например, так:
{
"prop1": "Hello World", // Распакованное значение.
"prop2": "%%DECRYPTED|CurrentUser|SHA512|00DD37AA6E8AA22E9B11DFC6B8B5DD9706D9FD8C|Hello World|DECRYPTED%%", // Секрет в расшифрованном состоянии.
"prop3": "Расшифрованный секрет в составе произвольного текста: %%DECRYPTED|CurrentUser|SHA512|00DD37AA6E8AA22E9B11DFC6B8B5DD9706D9FD8C|Hello World|DECRYPTED%%. Мама мыла раму.",
// Секрет в зашифрованном состоянии.
"prop4": "%%ENCRYPTED|CurrentUser|SHA512|00DD37AA6E8AA22E9B11DFC6B8B5DD9706D9FD8C|cFyOsNujOBp21frIVpIwMT2hjzR6ZDsAtZfs8eWfoVcLiqDqEO+rAEXVmE6KbQMLv+pizS8O/Ri124uM7YvM8NbsKfP2AQI4G/reup5I8kmpGXGkVjevuDuQ0eo5MRbobBPIXPFtvja9zCFn3hpNk/rt243vGMCbhCdIRgXRyOGrHxNuxlB7wHDEkZ+cz68D5cLLYYTF2ctpvgqMHjU7DRg5Vm5NT3N+Rn1FuAFmTa1laBm+Db5CM3yQ1M376FbEU6fiW3xnVrd7i52BREo4T80asmjFLcIxR8R7j5nBpZcSCM4e+wmD6IJGjJDh9Pc79I/s5P2bQduczJIxWIS1mQ==|ENCRYPTED%%",
"prop5": "Зашифрованный секрет в составе произвольного текста: %%ENCRYPTED|CurrentUser|SHA512|00DD37AA6E8AA22E9B11DFC6B8B5DD9706D9FD8C|cFyOsNujOBp21frIVpIwMT2hjzR6ZDsAtZfs8eWfoVcLiqDqEO+rAEXVmE6KbQMLv+pizS8O/Ri124uM7YvM8NbsKfP2AQI4G/reup5I8kmpGXGkVjevuDuQ0eo5MRbobBPIXPFtvja9zCFn3hpNk/rt243vGMCbhCdIRgXRyOGrHxNuxlB7wHDEkZ+cz68D5cLLYYTF2ctpvgqMHjU7DRg5Vm5NT3N+Rn1FuAFmTa1laBm+Db5CM3yQ1M376FbEU6fiW3xnVrd7i52BREo4T80asmjFLcIxR8R7j5nBpZcSCM4e+wmD6IJGjJDh9Pc79I/s5P2bQduczJIxWIS1mQ==|ENCRYPTED%%. Мама мыла раму."
}
Распаковкой секрета называется его замена в тексте на хранящееся в нём расшифрованное значение. Например,
если в свойствах prop2
и prop4
приведённого выше JSON-файла выполнить распаковку секретов, то значения
этих свойств станут таким же, как у свойства prop1
.
Общая схема записи секрета в тексте следующая:
SecretOpenTag|SecretStorage|HashAlgorithmName|Thumbprint|Data|SecretCloseTag
где:
SecretOpenTag
- тег открытия секрета. Если секрет зашифрован, то это будет тег%%ENCRYPTED
. Если расшифрован, то%%DECRYPTED
.SecretStorage
- хранилище, в котором находится нужный сертификат. Допустимые значения:LocalMachine
иCurrentUser
.HashAlgorithmName
- наименование алгоритма хеширования. Допустимые значения:MD5
,SHA1
,SHA256
,SHA384
,SHA512
.Thumbprint
- отпечаток сертификата, с помощью ключей которого следует выполнять шифрование и расшифровку секрета. Это значение можно посмотреть в настройках сертификата на вкладке "Состав".Data
- данные, сохраняемые в секрете. Если секрет не зашифрован, то этими данными будет обычный текст. Если секрет зашифрован, то в качестве значения будут записаны зашифрованные данные в формате строкиbase64
.SecretCloseTag
- тег закрытия секрета. Если секрет зашифрован, то это будет тегENCRYPTED%%
. Если расшифрован, тоDECRYPTED%%
.
В качестве разделителя полей используется |
. Этот символ разрешено использовать в т.ч. и в тексте, сохраняемом в поле Data
.
Примеры работы с секретами
Примеры кода смотрите в юнит-тестах проекта Bushman.Secrets.Test
.
Распаковка секретов в настройках приложений
Примеры кода смотрите в юнит-тестах проекта Bushman.Extensions.Configuration.Secrets.Test
.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET Framework | net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
-
.NETFramework 4.6.2
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Bushman.Secrets.Abstractions:
Package | Downloads |
---|---|
Bushman.Secrets
Реализация абстракций, определённых в пакете Bushman.Secrets.Abstractions. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Первый выпуск пакета.