.NET TIPS

[ASP.NET]フォーム認証用のパスワードを暗号化するには?

山田 祥寛
2004/04/02

 別稿「TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?」では、web.configを利用したフォーム認証を紹介した。しかし、セキュリティに敏感な皆さんならば、きっと不安に思われた点があるはずだ。

 web.configのようなテキスト・ファイルで平文(=暗号化されていない文)のパスワードを管理して、果たしてパスワード漏えいの心配はないのだろうか。なるほど、ASP.NETのデフォルトの設定では、Webブラウザ経由でweb.configにアクセスすることはできない。管理者が自らmachine.configの設定を変更しない限り、HTTP経由でパスワードが漏えいする心配はないだろう。しかし、サーバ上のファイル・システムに対して直接にアクセス可能なユーザーが、その平文のテキスト・ファイルにアクセスした場合はどうだろうか。

 もちろん、適切なアクセス権限を設けておけば、むやみとアクセスされる心配はないが、逆にいえば、適切なアクセス制限が施されていない環境下では、管理者ではない一般のユーザーがパスワードを読み取れてしまう可能性があるのだ。また、ASP.NETやIIS、あるいはWindowsそのものにセキュリティ上のバグが存在し、web.configが読み取り可能な状態になってしまったとしたら? このようなトラブルは不可避とはいえ、それでもサイト(アプリケーション)管理者としては「最大限セキュアな状態」を保持する責任がある。

 そこで必要となるのが、パスワードの暗号化である。別稿「TIPS:構成ファイルのみでフォーム認証を実現するには?」で作成したweb.config(アプリケーション・ルート直下)を以下のように書き換えてみよう。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms name="Insider.NET" loginUrl="login_cs.aspx"
        protection="All" timeout="30">
        <credentials passwordFormat="SHA1">
          <user name="yyamada"
            password="8CB2237D0679CA88DB6464EAC60DA96345513964" />
          <user name="nkakeya"
            password="8CB2237D0679CA88DB6464EAC60DA96345513964" />
          <user name="kusui"
            password="8CB2237D0679CA88DB6464EAC60DA96345513964" />
        </credentials>
      </forms>
    </authentication>
  </system.web>
</configuration>
パスワードを暗号化した構成ファイル(web.config)

 <credentials>要素のpasswordFormat属性をSHA1(またはMD5)に変更したうえで、<user>要素のpassword属性にSHA1(またはMD5)形式で暗号化したパスワードをセットすればよい。passwordFormat属性に暗号化方式を指定しただけで、パスワード文字列が自動的に暗号化される仕組みではないので注意してほしい。パスワード文字列は、管理者が自ら手動でセットする必要がある。

 文字列の暗号化に際しては、FormsAuthenticationクラス(System.Web.Security名前空間)のHashPasswordForStoringInConfigFileメソッドという便利なメソッドがあらかじめ用意されている。第1パラメータに暗号化したい文字列を、第2パラメータに暗号化方式(SHA1またはMD5)を指定することで、戻り値として暗号化文字列を返してくれるという代物だ。

 以下では、このFormsAuthenticationクラスのHashPasswordForStoringInConfigFileメソッドを利用して、テキスト・ボックスから入力された文字列をMD5、SHA1方式で暗号化するサンプルを紹介することにしよう。ロジック的には非常に単純なサンプルであるが、自分でweb.configの設定を行う際に役立ててほしい。

<%@ Page ContentType="text/html" Language="C#" %>
<script runat="server">
void btnOk_Click(Object sender, EventArgs e) {
  ltrMd5.Text =
   FormsAuthentication.HashPasswordForStoringInConfigFile(txtPass.Text,"MD5");

  ltrSha1.Text=
   FormsAuthentication.HashPasswordForStoringInConfigFile(txtPass.Text,"SHA1");
}
</script>
<html>
<head>
<title>暗号化(MD5/SHA1)</title>
</head>
<body>
<form runat="server">
<h1>暗号化(MD5/SHA1)</h1>
<hr />
<asp:TextBox id="txtPass" runat="server" />
<asp:Button id="btnOk" onclick="btnOk_Click" runat="server" Text="暗号化" />
<p />
<table bgcolor="#ffffc0" border="1">
<tr>
  <th>MD5</th>
  <td><asp:Literal id="ltrMd5" runat="server" /><br /></td>
</tr><tr>
  <th>SHA1</th>
  <td><asp:Literal id="ltrSha1" runat="server" /><br /></td>
</tr>
</table>
</form>
</body>
</html>
MD5/SHA1方式で文字列を暗号化するサンプル・プログラム(C#:md5_sha1_cs.aspx)
 
<%@ Page ContentType="text/html" Language="VB" %>
<script runat="server">
Sub btnOk_Click(sender As Object, e As EventArgs)
  ltrMd5.Text = _
   FormsAuthentication.HashPasswordForStoringInConfigFile(txtPass.Text,"MD5")

  ltrSha1.Text= _
   FormsAuthentication.HashPasswordForStoringInConfigFile(txtPass.Text,"SHA1")
End Sub
</script>
<html>
<head>
<title>暗号化(MD5/SHA1)</title>
</head>
<body>
<form runat="server">
<h1>暗号化(MD5/SHA1)</h1>
<hr />
<asp:TextBox id="txtPass" runat="server" />
<asp:Button id="btnOk" onclick="btnOk_Click" runat="server" Text="暗号化" />
<p />
<table bgcolor="#ffffc0" border="1">
<tr>
  <th>MD5</th>
  <td><asp:Literal id="ltrMd5" runat="server" /><br /></td>
</tr><tr>
  <th>SHA1</th>
  <td><asp:Literal id="ltrSha1" runat="server" /><br /></td>
</tr>
</table>
</form>
</body>
</html>
MD5/SHA1方式で文字列を暗号化するサンプル・プログラム(VB.NET:md5_sha1_vb.aspx)

 このサンプル・プログラムを実行すると、次の画面のようになる。

MD5/SHA1方式で文字列を暗号化するサンプル・プログラムの実行結果
テキスト・ボックスに入力した文字列がMD5/SHA1方式で暗号化されて、下の表に表示される。

 以上で、文字列を暗号化できるようになった。これによって暗号化された文字列を、先ほどの構成ファイル(web.config)の<user>要素のpassword属性にセットすればよい。

 なお、パスワードを暗号化しても、ログイン・ページそのものは変更する必要がない。

 また、FormsAuthenticationクラスのAuthenticateメソッドで認証判定を行う場合、次のコードのようにメソッドのパラメータにあらかじめ暗号化された文字列を渡そうとする方がよくいるが、これは誤りだ。

FormsAuthentication.Authenticate(txtUsr.Text,FormsAuthentication.HashPasswordForStoringInConfigFile(txtPass.Text,"SHA1"))

 Authenticateメソッドはメソッドの内部でパスワードの暗号化方式を自動判定し、与えられた平文のパスワードを暗号化したうえで認証判定を行ってくれるので、プログラマが暗号化の有無や種類を意識する必要はまったくない。End of Article

カテゴリ:Webフォーム 処理対象:構成ファイル
カテゴリ:Webフォーム 処理対象:認証
使用キーワード:<credentials>要素
使用キーワード:<user>要素
使用ライブラリ:FormsAuthenticationクラス(System.Web.Security名前空間)
関連TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?
[ASP.NET]フォーム認証のユーザー管理をデータベース・サーバで行うには?
文字列を暗号化するには?[C#/VB]
ファイルをNTFSの機能で暗号化/復号するには?
[ASP.NET]構成ファイルのみでフォーム認証を実現するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


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 記事ランキング

本日 月間