2010年6月4日金曜日

.NET 構成ファイルapp.configの暗号化

キーの配布などがなく、複号化の手間がない方法でapp.configのセクションを暗号化する方法です。

キーの配布をしたくないので、ユーザマシンでインストール時にapp.configを暗号化します。
復号化は自動でやってくれるので、app.configから値を取得するコードは変更しなくても大丈夫です。



app.configのappSettingsセクションとConnectionStringsセクションを暗号化するサンプルです。

1、まずWindowsアプリケーションを作成し、appSettingsセクションとConnectionStringsセクションのあるapp.configを用意します。
<configuration>

  <appsettings>
    <add key="PASSWORD" value="ABCDEFGHIJKLMN">
  </appsettings>
  
  <connectionstrings>
    <add connectionstring="user id=username;password=pswd;data source=mydb" name="DB1" providername="System.Data.OracleClient">
  </connectionstrings>
  
  …省略…
  
</configuration>

2、インストーラで実行するカスタム動作を定義したクラスを作成します。
同じソリューションに新しいクラスライブラリのプロジェクトを作成します。
参照設定に「System.Configuration.dll」と「System.Configuration.Install.dll」を追加します。
そして「System.Configuration.Install.Installer」クラスを継承したクラスを作成します。
Imports System.Configuration

<system.componentmodel.runinstaller(true)> _
Public Class Class1
    Inherits System.Configuration.Install.Installer

    Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
        MyBase.Install(stateSaver)

        Call CryptographyAppConfig()
    End Sub

    ''' <summary>
    ''' app.configのセクションを暗号化します。
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub CryptographyAppConfig()
        Dim sProtectedProvider As String = "DataProtectionConfigurationProvider"

        ' インストール先の情報を取得
        Dim targetDir As String = Me.Context.Parameters("targetdir")
        Dim appNmae As String = Me.Context.Parameters("appname")

        'app.config
        Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(targetDir + appNmae)

        'app.configのセクションを暗号化
        Dim sec1 As ConfigurationSection = config.GetSection("appSettings")
        sec1.SectionInformation.ProtectSection(sProtectedProvider)
        sec1.SectionInformation.ForceSave = True

        Dim sec2 As ConfigurationSection = config.GetSection("connectionStrings")
        sec2.SectionInformation.ProtectSection(sProtectedProvider)
        sec2.SectionInformation.ForceSave = True

        config.Save(ConfigurationSaveMode.Full)

    End Sub
End Class

3、セットアッププロジェクトを作成します。
同じソリューションにセットアッププロジェクトを追加し、アプリケーションフォルダに
1で作成したWindowsアプリケーションのプライマリ出力
2で作成したクラスライブラリのプリマり出力を追加します。


次にセットアッププロジェクトの「カスタム動作エディタ」を開き「インストール」ノードを右クリック「カスタム動作の追加」を選択します。
「アプリケーションフォルダ」からクラスライブラリのプリマり出力を選択します。
追加したカスタム動作のCustomActionDataプロパティに/targetdir="[TARGETDIR]/" /appname="WindowsApplication2.exe"を設定します。
※appnameは1で作成したWindowsアプリケーションのexeを指定してください。


以上で設定は終了です。
作成したセットアッププロジェクトでインストールを実行すると、app.configが暗号化されています。

0 件のコメント: