.NETエンタープライズ
Webアプリケーション開発技術大全

Webアプリケーションの状態管理

マイクロソフト コンサルティング本部 赤間 信幸
2004/05/20
Page1 Page2 Page3 Page4

2.4 Webファームを利用する場合の暗号化鍵の設定

 ASP.NETランタイムがクライアントブラウザに送出するViewStateデータには、改ざん検出機能が備わっている。これは、悪意のあるユーザによるViewStateデータの書き換えを防ぐためのもので、具体的にはWebサーバが持つ暗号化鍵を利用した、鍵付きハッシュ値の付与により実現されている。このため、Webファームを構成する場合には、すべてのWebサーバで暗号化鍵を揃えておく必要がある

 ハッシュ値や鍵付きハッシュ値に馴染みのない方も多いと思われるので、まずこれらについて以下に簡単に説明する。

 ハッシュ値とは一種のチェックサムのようなもので、元データをある特殊な計算関数に通すことによって算出される160ビット程度の値である。元データが1ビットでも違うと全くといってよいほど異なる値が出力されるようになっているため、元データが改ざんされていないことを確認する便利な方法として広く利用されている(図4)※5

※5 なお、ハッシュは、暗号化や圧縮とは異なる。暗号化や圧縮は元のデータに復元することができるが、ハッシュ値から元のデータを復元することはできない。
  
図4 データの改ざんの有無をチェックできるハッシュ値

 ハッシュ値を求める関数(ハッシュ関数)には様々な種類があるが、その中でも有名なものは以下の2つである。

  • SHA-1 (160ビットのハッシュ値を算出)
  • MD5 (128ビットのハッシュ値を算出)

 またこれら以外にも、.NET Frameworkでは256ビット、386ビット、512ビット長のSHAハッシュ関数が提供されている(なおデフォルトのViewStateでは、SHA-1ハッシュ関数が利用されている)。

 しかし、ハッシュ関数のアルゴリズムは一般に広く公開されており、ハッシュ値そのものは誰でも算出できる。このため、改ざんあるいは偽造したデータからハッシュ値をも捏造し、これをセットにして配布すると、受け取った人はそれが改ざんされたものなのか否かを判断できない。この問題を防ぐために、鍵付きハッシュと呼ばれるものが利用される(図5)。

 鍵付きハッシュの考え方は極めて簡単で、元データに秘密鍵を連結してからハッシュ値を算出する、というものである。このようにすると、当該ハッシュ値は秘密鍵を持っているユーザにしか生成できなくなる。

図5 鍵付きハッシュ

 ASP.NETランタイムは、データ改ざんを防ぐため、Webサーバの持つ秘密鍵を用いた鍵付きハッシュ値を付与して、クライアントブラウザにViewStateデータを送出している※6。クライアントブラウザからViewStateがWebサーバに再送されると、ASP.NETランタイムは以下の作業を行う(図6)。

※6 正確には、ViewStateオブジェクトのデータと鍵付きハッシュがまとめた形でシリアライズ+Base64エンコード処理され、HTMLに__VIEWSTATE隠しタグとして出力される。
 
図6 ViewStateにおける鍵付きハッシュ値の利用

  • 送信されてきたViewStateと、Webサーバが持つ秘密鍵から、ハッシュ値を再計算する。

  • 再計算されたハッシュ値と、再送されてきた鍵付きハッシュ値を突き合わせる。

  • この2つがずれている場合には、何らかのデータ改ざんが行われたということを意味するため、セキュリティエラーとしてページ処理を中断する。

 この鍵付きハッシュ値の算出に利用されるサーバの秘密鍵は、(デフォルトでは)サーバごとに異なっている。このため、Webファームを構成する場合にはこの秘密鍵をあらかじめ揃えておかないと、別サーバがポストバックを受けた際にセキュリティエラーが発生してしまう(図7)。

図7 Webファーム構成時の秘密鍵の取り扱いの注意点

 秘密鍵は、当該Webアプリケーションの構成ファイルであるweb.configファイル※7か、あるいは当該Webサーバ全体に対して有効となる構成ファイルであるmachine.configファイル※8中のmachineKeyセクションにて設定する。設定例をリスト5に示す。

※7 Webアプリケーションが格納されているディレクトリ内に配置されている。
 
※8 .NET Framework 1.0の場合には、C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\CONFIGフォルダに格納されている。.NET Framework 1.1の場合にはv1.1.4322フォルダに格納されている。
 
<configuration>
  <system.web>
    <machineKey validationKey="08CE6B478DCE73……(中略)……E566D8AC5D1C045BA60"
                decryptionKey="4252D6B2268……(中略)……67F451CE65D0F2ABE9BCD3A"
                validation="SHA1"/>
  </system.web>
</configuration>
リスト5 configファイルへの秘密鍵の設定

 また、秘密鍵はリスト6のプログラムにより簡単に作成することができる。コンソールアプリケーションとして以下のコードを実行し、生成された鍵をweb.configあるいはmachine.configファイルに設定すればよい。

C#の場合

using System.Security.Cryptography;

// ハッシュ関数はSHA1とMD5の2通りを選択できるが、通常はSHA1を利用すればよい
int length = 64; // SHA1用(validationKey)
// int length = 24; // 3DES用(decryptionKeyを作る場合は24バイト分作成)
byte[] random = new Byte[length];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(random);
string s = "";
foreach (byte b in random) s+= b.ToString("x2");
Console.WriteLine(s);
VB.NETの場合

Imports System.Security.Cryptography

' ハッシュ関数はSHA1とMD5の2通りを選択できるが、通常はSHA1を利用すればよい
Dim length As Integer = 64 ' SHA1用(validationKey)
' int length = 24; // 3DES用(decryptionKeyを作る場合は24バイト分作成)
Dim random() As Byte = New Byte(length) {}
Dim rng As RNGCryptoServiceProvider = New RNGCryptoServiceProvider()
rng.GetBytes(random)
Dim s As String = ""
Dim b As Byte
For Each b In random : s+= b.ToString("x2") : Next
Console.WriteLine(s)
リスト6 秘密鍵の作成プログラム

 なお、秘密鍵は当該Webシステムの暗号処理に共通的に利用されるものであり、ViewStateの鍵付きハッシュ値の計算以外にも、ViewStateの暗号化やフォーム認証クッキーの暗号化などに利用される。万が一この鍵情報が盗まれると、認証情報やViewStateの捏造が容易に可能となるため、
この鍵は厳重に管理しなければならない

 先に記述した構成管理ファイルのうち、web.configファイルは開発中に多くの一般開発者の目に触れることになる。このため、machineKeyセクションはweb.configファイル上には記述せず、machine.configファイル上に記述するのが一般的である。また、運用サーバ上のmachine.configファイルは、一般開発者の目に触れないように厳重に管理しなければならない。


 INDEX
  .NETエンタープライズWebアプリケーション開発技術大全
  Webアプリケーションの状態管理
    1.状態管理の手法
    2.ViewStateとSessionの使い分け/データサイズの最適化
  3.Webファームを利用する場合の暗号化鍵の設定
    4.ViewStateのセキュリティ
 
インデックス・ページヘ  「.NETエンタープライズWebアプリケーション開発技術大全」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間