2011-12-20 29 views
4

シナリオ: 私は異なる顧客のために異なるマシンに配布されるWPFデスクトップアプリケーションを持っています。 アプリケーションにXML構成ファイルがあります。ApplicationConfiguration.xml このXMLファイルには接続文字列が含まれています。 ApplicationConfiguration.xmlファイルがメインアプリケーションのexeと共にアプリケーションのインストールフォルダにコピーされるので、これらの接続文字列を暗号化する必要があります。接続文字列RsaProtectedConfigurationProviderストラテジー

計画の戦略: 私の計画の戦略は、インストール後「ApplicationConfiguration.xml」ファイルを暗号化することでした。 (私は、すべてのより良いインストール時にそれを行うことができれば)

私が試してみました何: は、私は、ユーザーができるようにするために簡単なのWinFormsアプリケーションを作成することを決定し、インストール後にxmlファイルを暗号化する戦略に行きます'ApplicationConfiguration.xml'を参照し、単にボタンを押して暗号化します。 これを実行すると、xml構成ファイルの形式で新しいファイルが作成されました。 'ApplicationConfiguration.xml.Config'、元の'ApplicationConfiguration.xml'ファイルが接続文字列に影響を受けずにそのまま残っています... 今このファイルの内容を ' ApplicationConfiguration.xml 'ファイルが正常に機能するようになりました.xmlは今や暗号化されています。 したがって、.NET 4.0フレームワークでは、WPFアプリケーションにコードを書き込まなくてもXMLファイルをDECRYPTできます。

暗号化を行うには、以下を参照してくださいコード:

protected void EncryptConfig(Boolean bEncrypt) 
    { 
     string path = SelectedFilePath(); 

     Configuration config = ConfigurationManager.OpenExeConfiguration(path); 

     // Define the Rsa provider name. 

     const string provider = "RsaProtectedConfigurationProvider"; 

     // Get the section to protect. 

     ConfigurationSection connStrings = config.ConnectionStrings; 

     if (connStrings != null) 
     { 
      if (!connStrings.SectionInformation.IsProtected) 
      { 
       if (!connStrings.ElementInformation.IsLocked) 
       { 
        // Protect the section.    
        connStrings.SectionInformation.ProtectSection(provider); 
        connStrings.SectionInformation.ForceSave = true; 
        config.Save(ConfigurationSaveMode.Full); 
       } 
      } 
     } 

     MessageBox.Show("Config has been encrypted"); 
} 

私は

<?xml version="1.0" encoding="utf-8"?> 
<configuration>  
<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"> 
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" 
     xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> 
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
      <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> 
       <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 
       <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
        <KeyName>Rsa Key</KeyName> 
       </KeyInfo> 
       <CipherData> 
        <CipherValue>skfjshsadfhsadkjfsadhfsadkhfdsafhsadkfhkljdfh=</CipherValue> 
       </CipherData> 
      </EncryptedKey> 
     </KeyInfo> 
     <CipherData> 
      <CipherValue>adfdsafdsafdsfdsafsadfsadfsadfsdfasfdsadfsafsadfdsf=</CipherValue> 
     </CipherData> 
    </EncryptedData> 
</connectionStrings> 

上記のコードによって作成された(ダミー文字でCipherDataの交換)出力例を掲載していますだから私は上記のやり方と私がやろうとしていることについていくつか質問しています:

1) WPFアプリケーションで新しいコードを記述することなく、アプリケーションが暗号化された接続文字列を読み取ることはできますか?もしそうなら、自分のマシンですべての暗号化処理を実行すれば、各マシンは暗号化された接続文字列を読み取ることができますか?私は 'Key'が必要であると読んでいるので、上記のkeyName(Rsa Key)がどこから来るのか分からない。

2)なぜ上記のコード例でxmlファイルを保存すると、新しい 'xml.config'ファイルが作成されますか?新しく生成されたコードを元のapplicationConfiguration.xmlファイルに手動でコピーする必要がありますか?

ただ、私は次のコードを使用して新しいxml.configファイルを復号化する場合、追加する:

 connStrings.SectionInformation.UnprotectSection(); 
       config.Save(ConfigurationSaveMode.Full); 

を..私は次の出力を得ます!なぜ!:)

私は元の3つの接続文字列を取得すると思います...いいえ?

基本的に、接続文字列のxmlファイルを暗号化し、アプリケーションを展開して別のマシンで読み取ることができる正しい方法を探しています。

助けてください。

+0

私はこれについて読むことを覚えていますが、自分自身の考えを捨てました。設定ウィンドウを暗号化すると、生成された鍵がレジストリ内の安全な場所に保存されるため、HKCUは信じています。従って、これは各機械及び/又はユーザ上で行われなければならず、出荷前に行うことはできない。 –

答えて

0

.Net Encryptionを参照してください。ここではデータ保護APIは役立たず、暗号化されていない状態でマシン/ユーザーキーに暗号化する必要があります。

利用可能な暗号化クラスのいずれかを使用して、アプリに格納されたキーに暗号化し、誰もあなたのソフトウェアを逆アセンブルしないことを願っています。

+0

こんにちは、大丈夫ですので、通常のように各マシンにアプリケーションをインストールすれば...私の暗号化プログラムを実行して、それぞれのマシンで暗号化を実行します。それはあなたが意味することですか?ありがとう – Kev

+0

@Kev私はそれが推奨されるアプローチだと言っています。これは、 'インストールごとに'または 'インストール時に暗号化'のようなものです。 DPAPIを使用すると、最も安全な方法です。セットアッププログラムが動作する典型的な方法は、msiプロジェクト内の「インストール前またはインストール後のイベント」(誤った名前を許す)を無効にし、そこで暗号化プログラムの呼び出しをプログラムすることです。したがって、msiファイルが実行されると、イベントがトリガされ、インストールプロセス中に設定エントリが暗号化されます。 役に立つと思われるcodeprojectに関する記事がありました。申し訳ありませんが、私はリンクを手元に持っていません。 – gmaran23

関連する問題