セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 キーと証明書
J.D. Meier, Alex Mackman, Michael Dunner, and Srinath Vasireddy
Microsoft Corporation
November 2002
日本語版最終更新日 2003 年 3 月 17 日
適用対象:
Microsoft® ASP.NET
全体の概要については、「セキュリティ保護された ASP.NET アプリケーションの構築」の開始ページを参照してください。
要約 : キーと証明書に関する背景情報を記載しています。
目次
キーと証明書
非対称暗号化では、公開キー/秘密キーのペアを使用します。秘密キー (または公開キー) で暗号化されたデータは、対応する公開キー (または対応する秘密キー) でのみ解読できます。
公開キーは、その名前が示すとおり、一般に公開されるキーです。逆に、秘密キーは、特定の個人が他者に知られないように保管しておくキーです。公開キーをユーザーに配布するためのメカニズムとなるのが証明書です。通常、証明書には、証明機関 (CA) による署名が付加されています。この署名は、公開キーがその公開キーを送信したと主張している対象者からのものであることを証明します。CA は、メッセージを交換する 2 者の間で相互に信頼されているエンティティです。
デジタル証明書の実装には、証明書に署名するプロセスが組み込まれるのが普通です。このプロセスを図 1 に示します。
図 1 デジタル証明書に署名するプロセス
図 1 に示した一連のイベントは、以下のように実行されます。
- Alice は、自分の名前、公開キーおよびその他の省略可能な情報が含まれている署名付き証明書要求を CA に送信します。
- CA は、Alice の要求に基づいてメッセージを作成します。CA は、CA 自体の秘密キーでメッセージに署名し、別の署名を作成します。CA は、メッセージと署名を Alice に返します。このメッセージと署名の組み合わせが Alice の証明書となります。
- Alice は、自分の証明書を Bob に送信することで、自分の公開キーへのアクセスを Bob に許可します。
- Bob は、CA の公開キーを使用して証明書の署名を確認します。署名が有効であることが証明されれば、Bob は証明書の公開キーを Alice の公開キーとして受け入れます。
他のデジタル署名の場合と同様に、CA の公開キーにアクセスできる受信者は、証明書が特定の CA によって署名されたものかどうかを確認できます。これを行うには、秘密情報へのアクセスは不要です。上記のシナリオでは、Bob が CA の公開キーにアクセスできます。Bob が公開キーの含まれている CA の証明書のコピーを持っていれば、公開キーにアクセスできることになります。
X.509 デジタル証明書
X.509 デジタル証明書には、ユーザー名と公開キーの他に、ユーザーに関するその他の情報が含まれます。X.509 デジタル証明書は、単にデジタル信頼階層をたどるための踏み台としての役割を果たすだけではありません。これらの証明書は、証明書の対象者の公開キーを信頼するための手段を証明書の受信者に与えるだけにとどまらず、証明書の対象者に関して、その他の情報をも提供します。このような付加情報としては、電子メール アドレス、特定のドキュメントに署名する権限、CA となり、その他の証明書に署名する権限などがあります。
他の多くの証明書と同様に、X.509 証明書には有効期限があります。証明書の期限が切れると、その証明書は失効します。CA が何らかの理由で証明書を失効させることもあります。CA が発行した証明書のうち、失効した証明書は、証明書失効リスト (CRL) に記載され、公開されます。ネットワーク ユーザーは、CRL にアクセスして証明書の有効性を確認します。
証明書ストア
証明書は、証明書ストアと呼ばれる安全な場所に保管されます。証明書ストアには、証明書のほかに CRL と証明書信頼リスト (CTL) を保存できます。ユーザーごとに個人用のストア ("個人") があり、そこにユーザーの証明書が保存されます。"個人" ストアは、レジストリ、ローカル コンピュータまたはリモート コンピュータ、ディスク ファイル、データベース、ディレクトリ サービス、スマート デバイスなど、さまざまな場所に物理的に実装できます。
個人 ストアには任意の証明書を保存できますが、このストアは、ユーザーの個人証明書、つまり、各ユーザーのメッセージの署名と暗号化解除に使用する証明書の保管を目的としています。
Windows では、"個人" ストアのほかに、以下の証明書ストアが維持されます。
- 信頼されたルート証明機関 このストアには、ユーザーが信頼しており、ほかのユーザーへの証明書発行に使用する証明機関の証明書が格納されます。いくつかの信頼済み CA 証明書が標準で用意されています。管理者がほかの証明書を追加することもできます。
- ほかの人 このストアには、ユーザーが署名付きメッセージを交換した相手方のユーザーの証明書が格納されます。
CryptoAPI には、証明書管理用の関数が用意されています。これらの API 関数は、アンマネージ コードからのみアクセスできます。CryptoAPI 用の COM ベースの API として CAPICOM があり、COM Interop 経由でアクセスできます。
詳細情報
詳細については、MSDN ライブラリの「Cryptography, CryptoAPI, and CAPICOM」 (英語情報) を参照してください。
暗号化
暗号化は、以下の目的で使用されます。
- 機密性の維持 データが他者に漏洩しないように保護することを意味します。機密性の維持には、暗号化を使用するのが普通です。暗号化アルゴリズム (暗号化キーを使用するアルゴリズム) により、プレーン テキストを暗号化テキストに変換します。暗号化テキストをプレーン テキストに戻すときも、同等の解読アルゴリズムを使用します。暗号化と解読に同じキーを使用するアルゴリズムは対称暗号化アルゴリズムと呼ばれ、公開キー/秘密キーのペアを使用するアルゴリズムは非対称暗号化アルゴリズムと呼ばれます。
- データ整合性の維持 データを過失または故意 (悪意) による変更から保護することを意味します。整合性の維持には、通常、メッセージ認証コードやハッシュを使用します。ハッシュとは、一連のデータから導き出される固定長の数値です。ハッシュ値は、セキュリティ保護されていないチャネルを通じて送信されたデータの整合性を確認するために使用されます。受信したデータのハッシュ値を送信時のハッシュ値と比較することで、データが変更されていないかどうかを確認します。
- 認証 データの身元を保証することを意味します。認証には、デジタル証明書が使用されます。かなり大量のデータを小さいハッシュ値で表すことができるので、通常は、メッセージのハッシュ値にデジタル署名を付加します。
どの技術を選択すればよいか
- ハッシュ データが転送中に改ざんされていないことを確認したい場合に使用します。
- キー付きハッシュ あるエンティティとの間で秘密情報をやり取りすることなく、そのエンティティが秘密情報を知っていることを証明したい場合や、転送中のデータ傍受に対する防御策を講じたい場合に使用します。
- 暗号化 セキュリティ保護されていないメディア上でデータを送信する場合や、データを永続的に保管するときに機密性を維持する場合に使用します。
- 証明書 公開キーの所有者であることを主張している個人が、間違いなく所有者であることを確認するときに使用します。
- 対称暗号化 処理速度を優先したい場合や、メッセージを交換する両者が事前にキーを共有している場合に使用します。
- 非対称暗号化 セキュリティ保護されていないメディアを通じてデータを安全に交換する場合に使用します。
- デジタル署名 認証と否認不能性が必要な場合に使用します。
- salt 値 ディクショナリ アタックに対して防御するには、salt 値 (暗号化技術で生成された乱数) を使用します。
.NET における暗号化
System.Security.Cryptography 名前空間に暗号化サービスが用意されています。セキュリティで保護されたデータ暗号化/解読、ハッシュ、乱数生成およびメッセージ認証の各サービスがあります。
.NET Framework には、多くの標準的な暗号化アルゴリズムが実装されています。対称アルゴリズム、非対称アルゴリズム、ハッシュ アルゴリズムなどの基本的なアルゴリズム タイプを定義する抽象クラスとアルゴリズム クラスからなる継承階層が明確に定義されているので、これらの実装は簡単に拡張できます。
表 1 .NET Framework が標準で実装クラスを用意しているアルゴリズムの一覧
対称アルゴリズム | 非対称アルゴリズム | ハッシュ アルゴリズム |
---|---|---|
DES (Data Encryption Standard) | DSA (Digital Signature Algorithm) | HMAC SHA1 (SHA1 ハッシュ アルゴリズムを使用するハッシュ ベースのメッセージ認証コード) |
トリプル DES (Data Encryption Standard) | RSA | MAC Triple DES (トリプル DES を使用するメッセージ認証コード) |
Rijndael | MD5 | |
RC2 | SHA1、SHA256、SHA384、SHA512 各種ハッシュ サイズを使用する SHA (Secure Hash Algorithm) |
対称アルゴリズムのサポート
.NET には、秘密キーの対称暗号化アルゴリズムを提供するクラスとして、以下のクラスが用意されています。
- DESCryptoServiceProvider
- RC2CryptoServiceProvider
- RijndaelManaged
- TripleDESCryptoServiceProvider
メモ "CryptoServiceProvider" で終る名前のクラスは、暗号化サービス プロバイダ (CSP) の基盤サービスを使用するラッパーです。また、"Managed" で終る名前のクラスは、マネージ コード内に実装されています。
図 2 は、.NET Framework で採用されている継承階層を示しています。アルゴリズム タイプの基本クラス (SymmetricAlgorithm など) は、抽象クラスです。アルゴリズム タイプを表す抽象クラスから、複数の抽象アルゴリズム クラスが派生します。DES、トリプル DES、Rijndael、RC2 などの特定のアルゴリズムは、アルゴリズム実装クラスとして具体的に実装されています。
図 2 対称暗号化クラスの継承階層
非対称アルゴリズムのサポート
.NET では、抽象基本クラス (System.Security.Crytography.AsymmetricAlgorithm) を通じて、以下の非対象 (公開キー/秘密キー) 暗号化アルゴリズムをサポートしています。
- DSACryptoServiceProvider
- RSACryptoServiceProvider
これらのアルゴリズムは、データのデジタル署名と暗号化に使用されます。継承階層は、図 3 に示すとおりです。
図 3 非対称暗号化クラスの継承階層
ハッシュ アルゴリズムのサポート
.NET では、以下のハッシュ アルゴリズムをサポートしています。
- SHA1, SHA256, SHA384, SHA512
- MD5
- HMACSHA (キー付きハッシュ アルゴリズム)
- MACTripleDES (キー付きハッシュ アルゴリズム)
ハッシュ アルゴリズム クラスの継承階層は、図 4 に示すとおりです。
図 4 ハッシュ称暗号化クラスの継承階層
要約
暗号化は、セキュリティで保護された Web アプリケーションを構築するうえで重要なテクノロジです。この付録では、証明書および暗号化の基礎を説明すると共に、System.Security.Cryptography 名前空間で公開される一部のクラスについても触れました。これらのクラスを使うと、暗号化セキュリティ ソリューションを .NET アプリケーションに容易に組み込むことができます。
.NET における暗号化の詳細については、MSDN ライブラリの「.NET Framework の暗号モデル」を参照してください。