読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

ADO.NET入門記-003 (接続文字列の暗号化(aspnet_regiis))

C# ADO.NET

通常、GUIツールを使用しても手動で接続文字列を書いても、接続文字列自体は
プレーンテキストとなります。でも、このままではセキュリティ上駄目な場合が
多いです。その場合は、暗号化という手段をとるのですが、app.configファイルを
使用している場合は、少し手間がかかります。
何故かといいますと、本来ASP.NET用のweb.configファイル暗号化ツールである
コマンドをapp.configに使用するためです。


以下そのための手順を書きます。


1.まず、普通にapp.configを書きます。以下のように書いたとします。

<configurations>
    <connectionStrings>
        <add name="AdoNetSampleDB"
             connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=adonet_sample_db;Integrated Security=True"
             providerName="System.Data.SqlClient"/>
    </connectionStrings>
</configurations>


2.次に、Visual Studio 2005コマンドプロンプトを起動します。スタートメニューからVisualStudio2005の中にあるやつです。
それか、普通にコマンドプロンプトを上げて、パスに.NET Frameworkのフォルダを追加します。

その状態で、app.configが存在しているディレクトリまで移動し、moveコマンドでファイルの名前を一時的にweb.configに
リネームします。

move app.config web.config


3.リネーム後、以下のコマンドを発行することでconnectionStringsセクションが暗号化されます。

aspnet_regiis -pef "connectionStrings" .


4.暗号化された後、再びmoveコマンドでファイルを元にもどします。

move web.config app.config


これで完了です。VisualStudioにてファイルを開いてみてみると以下のように暗号化されているはずです。

<?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>npU1qDjAJjj9io6BqyvIjvzuXwlaRvoooQ5ySlUDv0JFB8vpv0m6k5pFZdbK9BlvBH2vCM/LzWsj9AvzkzuoNAg2CgPtn7Lh6Q+y5SFFUnYS8kxi7hznOMAU88PzdVdRm7TzpmyzdEtTHwxg/cGXQkDG1vLgMa2cnPzTcvkwcBE=</CipherValue>
                    </CipherData>
                </EncryptedKey>
            </KeyInfo>
            <CipherData>
                eEaNrTsL2UbGE7EKF/4EIGVT5YCOrWhpiXHemsWUpDW+XjeItpuMhxkRLgdXnXDFBhu7c20Jpt/+Tk1J0VKRuWjfNggetSR+XWyCS61vdEPyRmMASLeTn5QLcnTDcAQyKKIrAaXHPIMK07Iec1VkFl5lSlKG9Ox5DH279oHvExKhY4kKVLz+HIyQ4zl9AsH6Ans1LOWMr5W9+ME55oQ7PeeLrkvVt7B7etp1YDGvIayt/ii42FajNop+RSXMEpLWdJe0FZoqba620RwdzmpQW7QSU6vXRSPIxAGIWmx3Z9w/8D9CVYM53A==</CipherValue>
            </CipherData>
        </EncryptedData>
    </connectionStrings>
</configuration>


後は、これを読み込めるか確認してみます。暗号化された情報の複合化は.NET Frameworkの方で
自動的にやってくれます。こちらは、いつもと同じように取得するだけです。
尚、暗号化を行なっている場合、複合化する手間がかかるので、取得するのに少しだけ時間がかかります。


以下サンプルです。

using System;
using System.Data;
using System.Data.Common;
using System.Configuration;

using NUnit.Framework;

using Gsf.Lib.UnitTests;

namespace Gsf.Samples.AdoNet {

    [TestFixture(Description="接続文字列の暗号化を行なってみるテスト")]
    public class AdoNetSample004 : TestBase{

        [Test()]
        public void 接続文字列の暗号化したものを読み込んでみる(){

            string decrypedConnectionString = ConfigurationManager.ConnectionStrings["AdoNetSampleDB"].ConnectionString;

            Assert.IsFalse(string.IsNullOrEmpty(decrypedConnectionString));

            DbConnectionStringBuilder builder = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnectionStringBuilder();
            builder.Add("Data Source",         "localhost\\SQLEXPRESS");
            builder.Add("Initial Catalog",     "adonet_sample_db");
            builder.Add("Integrated Security", "True");

            Assert.AreEqual(builder.ToString(), decrypedConnectionString);
        }
    }
}


app.configの暗号化には、以下のサイトを参考にしました。m(_ _)m