2017-06-07 11 views
1

自分で作成した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)); 
    } 
} 

答えて

1

あなたはASPNET /構成リポジトリで内部JsonConfigurationFileParserクラスhereでのぞき見を取ることによって、これを解決することができます。 プロジェクトで同様のクラスを作成すると、解読されたJSON文字列を正常に解析できます。

パーサーを使用するには、jsonStringStreamとしてParse()メソッドに渡します。 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); 

    //treat the decrypted string as a Stream to let JsonConfigurationFileParser handle it 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     var parser = new JsonConfigurationFileParser(); 
     StreamWriter writer = new StreamWriter(stream); 
     writer.Write(jsonString); 
     writer.Flush(); 
     stream.Position = 0; 
     return parser.Parse(stream); 
    }; 
} 
+0

私はこのことをうれしく思います。私は実際にそのことをやっていましたが、そのクラスは内部的なものなので、コードをコピーしなければなりませんでした。 – blgrnboy

関連する問題