自分で作成したConfigurationProvider
のパスを使って、暗号化されていないファイルを暗号化し、復号化することもできます。暗号化されたファイルからの設定の追加/読み取り
私は現在、解読されたappsettings.jsonコンテンツ(暗号化解除された文字列)を、その.AddJsonFile()
と同じように設定に追加する方法を考えるのに苦労しています。
最終的にはStartup.cs
に.AddEncryptedJson("appsettings.json")
を呼び出して、ファイルを復号化し、必要なすべての設定を追加することができます。
public class CustomConfigProvider : ConfigurationProvider, IConfigurationSource
{
private readonly RSA _pubKey;
private readonly RSA _privKey;
private readonly string _filePath;
public CustomConfigProvider(string filePath)
{
var cert = new X509Certificate2(Path.Combine(Directory.GetCurrentDirectory(), "certs", "IdentityServer4Auth.pfx"), "test");
_pubKey = RSACertificateExtensions.GetRSAPublicKey(cert);
_privKey = RSACertificateExtensions.GetRSAPrivateKey(cert);
_filePath = filePath;
}
public override void Load()
{
Data = UnencryptMyConfiguration();
}
private IDictionary<string, string> UnencryptMyConfiguration()
{
EncryptIfNotEncrypted();
var configFileBytes = File.ReadAllBytes(_filePath);
var decryptedData = _privKey.Decrypt(configFileBytes, RSAEncryptionPadding.Pkcs1);
var jsonString = Encoding.UTF8.GetString(decryptedData);
jsonString = jsonString.Trim(new char[] { '\uFEFF', '\u200B' });
dynamic result = JsonConvert.DeserializeObject(jsonString);
Dictionary<string, string> dictObj = result.ToObject<Dictionary<string, string>>();
return dictObj;
}
private void EncryptIfNotEncrypted()
{
var configFileBytes = File.ReadAllBytes(_filePath);
// Check if encrypted
try
{
_privKey.Decrypt(configFileBytes, RSAEncryptionPadding.Pkcs1);
}
catch
{
var encryptedData =
_pubKey.Encrypt(configFileBytes, RSAEncryptionPadding.Pkcs1);
using (var fs = new FileStream(_filePath, FileMode.Create, FileAccess.Write))
{
fs.Write(encryptedData, 0, encryptedData.Length);
}
}
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new CustomConfigProvider(_filePath);
}
}
public static class CustomConfigProviderExtensions
{
public static IConfigurationBuilder AddEncryptedJson(this IConfigurationBuilder builder, string filePath)
{
return builder.Add(new CustomConfigProvider(filePath));
}
}
私はこのことをうれしく思います。私は実際にそのことをやっていましたが、そのクラスは内部的なものなので、コードをコピーしなければなりませんでした。 – blgrnboy