EternalWindows
CSP / CryptoAPIの概要

セキュリティを強化するという言葉は、達成したい目的によって様々な意味に捉えることができます。 たとえば、あるユーザーがシステムにログオンしてもよいかを識別する作業は、 セキュリティ的な用語では認証(Authentication)となります。 一方、ファイルなどのリソースにアクセスしてもよいかを識別するのは承認(Authorization)であり、 Windowsのセキュリティモデルはこの承認と認証が基盤となっています。 しかし、インターネットのようなグローバルな環境で言うセキュリティとは、 主として暗号化や証明書に関わる話題ではないでしょうか。 たとえば、メールを暗号化して送るにはS/MIMEというプロトコルを使用し、 個人情報を送信する場合はwebサーバーの証明書を確認するなどはその好例です。 Windowsでは、こうしたセキュリティを実装するためのAPIとして、 CryptoAPI(CAPIと略されることもあります)を始めとする様々なAPIが用意されています。

データの暗号化や証明書の取り扱いにCryptoAPIがよく使用されるのは、 このAPIがWindows 95という初期の段階から公開されたことが1つの理由といえます。 また、スマートカードなどのセキュリティモジュールを開発する企業が、 アプリケーションからモジュールへのアクセスをCryptoAPIで行えるようにした点も大きいといえるでしょう。 時はWindows Vistaになり、暗号化用のAPIとしてCNG(Cryptography API: Next Generation)、 証明書用のAPIとしてCertEnroll(Certificate Enrollment API)が登場しました。 これらのAPIがCryptoAPIに取って代わることになるのかは現在では分かりませんが、 これらからは暗号化や証明書の取り扱いにCNGやCertEnrollも視野に入れる必要があるといえます。

CryptoAPIに1.0や2.0というバージョンが存在している点は、少し混乱を招きやすい部分でもあります。 それは、1.0とされる暗号化関数がadvapi32.dllに実装されているのに対し、 2.0の証明書関数がcrypt32.dllに実装されているからです。 CryptoAPIにおけるバージョンというのは、いわば機能を示す指標ですから、 2.0の関数の方が優れているというようなことはありません。 暗号化を行いたい場合は、やはり1.0の関数を呼び出すことになります。 本章では1.0の関数について説明し、 残りの証明書管理、自己署名入り証明書、PKCS #7、ファイル署名、証明書検証の各章では 2.0の関数の使い方を説明します。

現時点で理解しておくべきことではありませんが、CryptoAPI2.0にも暗号化を行う関数は存在します。 これらはいわば、証明書をベースとした暗号化です。 この暗号化は内部的にCryptoAPI1.0を呼び出しで実現されていましたが、 Windows VistaからはCNGの呼び出しにも対応するようになっています。 具体的には、証明書に関連付ける情報をCryptoAPI1.0のCSPにするか、 CNGのKSPにするかで内部的な呼び出しが変化します。 このような動作を踏まえた場合、現在はCryptoAPI1.0で暗号化を行うけれども、 将来的にはCNGの暗号化を考えるような場合は、 証明書ベースの暗号化を考慮するとよいでしょう。 このようにすれば、使用する証明書を変更するだけで、 CryptoAPI1.0とCNGの切り替えを行うことができます。


戻る