LoginSignup
5
6

More than 5 years have passed since last update.

続3・REST Webサービス作成メモ(Web.configの暗号化)

Last updated at Posted at 2017-08-05

前回までのあらすじ

C言語しか知らない筆者がREST Webサービスを作成しようと思い立ち、サービス側プログラムと、クライアント側プログラムの作成、SSL有効化まで辿り着きました。

今回は、Web.configに設定値を平文で持たせず、暗号化して持たせる。です。

本記事のゴール

  • 設定値はWeb.configで一括して定義するが、シークレットキー等のデリケートな設定値だけは平文で書き込まず、暗号化済みの文字列を持たせる。
  • ただしプログラムから使用する場合は、暗号化前のキーを透過的に使用できるようにする(復号処理をゴリゴリ書きたくない)。

1.Web.configへの設定値の定義

例えば、何かのAPIのシークレットキー「p@5k#2Az」をWeb.configに定義したとします。

Web.config
<configuration>
  <appSettings>
    <add key="SecretKey" value="p@5k#2Az" />
  </appSettings>
<!-- 以下略 -->

平文かあ…いけてない。そこで、上記箇所を暗号化します。

2.設定値の暗号化

Web.configの暗号化には、aspnet_regiis.exeコマンドを使用します。

  • このコマンドを実行すると、Web.configファイルの任意のセクションが暗号化されます(暗号化後のファイルが新規に生成されるわけではなく、元のWeb.configの該当箇所が、暗号化後の文字列に更新される)。

2.1.aspnet_regiisの場所

このコマンドのパスは、.Net Frameworkのバージョンによって異なるそうです。僕の環境では以下に存在しました。

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe

2.2.aspnet_regiisの使用方法

2.2.1.暗号化する場合

暗号化
aspnet_regiis.exe -pef <セクション名> <Web.configが格納されたフォルダのパス名>
  • -pefオプションには、暗号化の対象としたいセクション名(例:appSettings)を指定します
  • 第二引数にはWeb.configが格納されたフォルダのパス名を指定します。
  • 同時に複数のセクションを指定することはできないようです(-pef "appSettings1" -pef "appSettiongs2"とか、-pef "appSettings1" "appSettiongs2"はできない)。複数セクションを暗号化したい場合、セクションごとにコマンドを実行する必要があります。
  • 暗号化後のWeb.configを、さらに暗号化した場合、二重に暗号化されてしまうことはない?→問題ありません。「暗号化しています...成功しました!」というメッセージが出て、暗号化文字列は再生成されますが、復号を2回しなければならない、とかそういうことはありません。

以下、暗号化の例です。

コマンドの実行例(コマンドプロンプト)
>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe" -pef "appSettings" "C:\Users\yz2cm\OneDrive\Documents\Visual Studio 2017\Projects\ProductsApp\ProductsApp"
Microsoft(R) ASP.NET IIS 登録ツール バージョン 4.0.30319.0
ローカル コンピューターの ASP.NET をインストールおよびアンインストールするための管理ユーティリティです。
Copyright(C) Microsoft Corporation.  All rights reserved.
構成セクションを暗号化しています...
成功しました!

Web.configを開くと、なんか訳の分からないことになっています。無事、暗号化に成功したようです。

Web.config(暗号化済み)
<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.microsoft.com/fwlink/?LinkId=301879
  -->
<configuration>
  <appSettings 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>Ka4kiku9OrXNJsKhINNVCCPz5hBpNmQpWWwgoB9Hh8ubjiA5mnsd4m7irFv4TpVHQ/8tQpS5ulr6aE3L5w27JLeLgICSuGs0euXW1WMke7kYm1HQoT18r/J2wV0whDBvhM95Sq9if7jbY/QTIrHGludSKAFHaSYqzgwkgZMmaYU=</CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>OFX1IO/ASUF3c3wbfxNpJmBmBa9o9uiF4AH4M93MNbUCDf41GuvwhjfjDsBpKGKlk6PAapng2OFg7O9jpdBmT6Yxa27ga83CXEalcaXRb4rCzP9V9dlsx2DBXzFNcea6UqnAo3kbywkIojpvNrDKJQqSQbuLV+NzwVTufoRDVGYNABn/N+nwD/EIa2LmqyvZoOqEYPAUeao=</CipherValue>
      </CipherData>
    </EncryptedData>
  </appSettings>
<!-- 以下略 -->

2.2.2.復号する場合

Web.configの設定値の確認や修正のために、暗号化済みのWeb.configを復号する方法です。

復号
aspnet_regiis.exe -pdf <セクション名> <Web.configが格納されたフォルダのパス名>
  • 暗号化時とのオプションの違いは、-pef-pdfとなっている点のみです。

3.プログラムでの設定値の使用(C#)

暗号化された設定値をプログラムで使用する場合、復号は自動でやってくれますので、プログラマーは設定値を透過的に使用することが可能です。

C#
using System.Configuration;

var result = ConfigurationManager.AppSettings["SecretKey"];
Console.WriteLine(result);  // p@5k#2Az

おめでとうございます。

参考

ASP.NET Web Configuration Guidelines

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6