アプリケーションプログラムが暗号認証機能を実装する場合,一般的には暗号認証機能を提供するライブラリ関数を利用する.このライブラリ関数のインタフェースとしては,次のような点の条件を持ったものが望ましいといえる.
アプリケーションプログラムから暗号認証機能を呼び出すインタフェース(暗号認証API)の標準化の動きは幾つか存在する. これまで提案されている暗号認証APIの代表的なもの以下に示す.
GSS-API | CryptoAPI | CNG |
PKCS#11 | CDSA(CSSM) | Java Security API |
GSS-API(Generic Security Service API)は,通信を前提としたアプリケーションプログラムに対してセキュリティ機能を付加する標準的なインターフェイスを提供しようとするものである.このインタフェイスは,セキュリティ機能のメカニズムや実装の詳細をアプリケーションプログラムから隠蔽する目的で使用される.
IETF(Internet Engineering Task Force)の次のドキュメントに仕様が提案されており,Open Groupでも採用されている.
GSS-APIは,ネットワークに分散したアプリケーション間の通信の保護を目的としたもので,通信を伴わないプログラムでのセキュリティ機能は指向していない.GSS-APIの適用領域は次のようなものである.
GSS-APIは次の4つに分類され,認証,完全性,秘密性用に37個のAPIが定義されている.
クライアントとサーバによって用いられるGSS-APIの例を示す.
(Client GSS-API) | (Client) | (Server) | (Server GSS-API) | |
---|---|---|---|---|
GSS_Init_sec_context() | ||||
output_token | ----> | GSS_Accept_sec_context() | input_token | |
GSS_Init_sec_context() | <---- | output_token | ||
input_msg | GSS_Seal() | |||
output_msg | ----> | GSS_Unseal() | input_msg | |
output_msg | ||||
GSS_Delete_sec_context() | ||||
input_token | GSS_Process_context_token() | <---- | output_token |
CryptoAPI (Microsoft Cryptographic API) は,Win32環境下における暗号認証用のAPIとして,Mcrosoftにより規定されたものである.CryptoAPIを用いるアプリケーションは,その実装の詳細を知ることなく暗号認証機能を利用することができる.
Cryptgraphic Service Provider(CSP)は,暗号認証APIに対応した具体的な暗号認証アルゴリズムの実装を提供するプロバイダである.
CSPでは次の3つの設計ルールが適用されている.
各プロバイダは,名前と提供する機能を表わすタイプを持つ. 次のタイプがあらかじめ定義されている.
Provider Type | Key Exchange | Signature | Eccryption | Hashing |
---|---|---|---|---|
PROV_RSA_FULL | RSA | RSA | RC2, RC4 | MD5, SHA |
PROV_RSA_SIG | N/A | RSA | N/A | MD5, SHA |
PROV_DSS | N/A | DSS | N/A | SHA |
PROV_FORTEZZA | KEA | DSS | Skipjack | SHA |
PROV_MS_EXCHANGE | RSA | RSA | CAST | MD5 |
PROV_SSL | RSA | RSA | varies | varies |
Microsoft Base Cryptographic ProviderがWindowsのOSに含まれてMicrosoft より提供されている. これには,PROV_RSA_FULLプロバイダタイプが実装されている.すなわち,鍵交換と署名用に512ビットのRSA暗号が,データの暗号化に40ビットのRC2およびRC4暗号が実装されている.また,メッセージダイジェストアルゴリズムとしてMD2,MD4,SHAが実装されている.
新しいプロバイダおよびデフォルトプロバイダの登録は,CSPファイルを規定されたディレクトリに格納することと,CryptoAPI用のシステムレジストリを更新することにより行なわれる.どのプロバイダを使うかは,CryptAcquireContext関数により指定することができる.この関数はアプリケーションがCryptoAPIを使うとき最初に呼び出す必要がある関数である.
Cryptography API: Next Generation (CNG) は,CryptoAPI の更改版と言えるもので,新しいアルゴリズムの追加や多くの拡張がなされている.CNG は,Windows Server 2008 と Windows Vista からサポートされている.CNG を実装したマイクロソフト製プロバイダは Bcrypt.dll である.CryptoAPI 1.0 でサポートされている暗号アルゴリズムは,CNG でもサポートされる.
暗号の基本操作を行う CNG API の代表的な使い方は,次のようになる.
暗号機能を持つデバイスのためのAPIとしてRSAにより定義されたものである (Cryptokiと呼ばれる).この仕様には,鍵管理,暗号処理,ディジタル署名,一般処理用に58のAPIが定義されている.
スマートカード(ICカード)やPCカード(PCMCIAカード)のような可搬型のコンピュータデバイスは秘密鍵の保管やセキュリティ機能を実行する装置として最適である.Cryptokiはこのような暗号認証機能を持ったデバイスとアプリケーションとのインタフェースとして設計された.
Cryptokiは,デバイスの詳細を抽象化し,暗号認証機能を持つデバイスの共通モデルをアプリケーションに提供するものである.また,アプリケーションが一度に複数のデバイスを扱うようにできるインタフェースを提供している.
共通データセキュリティアーキテクチャ (CDSA: Common Data Security Architecture) は,Intelが提唱し,Open Group (
http://www.opengroup.org/security/cdsa.htm) によって技術標準として採用されたオープンソースのセキュリティアーキテクチャである.
CDSAは,以下で構成される4層の水平アーキテクチャを定義している.
CDSAの核となるのはCSSM(Common Security Services Manager)であり,CSSM APIと呼ばれる暗号認証機能のアプリケーションインターフェイスを実装するモ ジュール群である.
CSSMの機能は次のサービスマネージャ(SM)から構成される.
CSSM APIを用いた鍵ペア生成時の呼出しシーケンス例を以下に示す.
CSSM_Init CSSM_ModuleLoad CSSM_ModuleAttach CSSM_CreateKeyGenContext CSSM_GenerateKeyPair CSSM_ModuleDetach CSSM_ModuleUnload CSSM_Terminate
以下の表に,上記3つの暗号認証APIの機能別に分類した比較を示す. なお,暗号認証機能に関するCSSM APIはPKCS#11をベースに規定されているため,機能的にはPKCS#11と同等である.
機能分類 | CryptoAPI | GSS-API | PKCS#11 |
---|---|---|---|
状態管理 | CryptAcquireContext | GSS_Init_sec | C_Initialize |
CryptReleaseContext | GSS_Accept_sec_context | C_GetInfo | |
GSS_Delete_sec_context | C_GetSlotList | ||
GSS_Process_context_token | C_GetSlotInfo | ||
GSS_Context_time | C_GetTokenInfo | ||
GSS_Inquire_context | C_GetMechanismList | ||
GSS_Wrap_size_limit | C_GetMechanismInfo | ||
GSS_Export_sec_context | C_InitToken | ||
GSS_Import_sec_context | C_OpenSession | ||
C_CloseSession | |||
C_CloseAllSessions | |||
C_GetSessionInfo | |||
C_CreateObject | |||
C_CopyObject | |||
C_DestroyObject | |||
C_GetObjectSize | |||
C_GetAttributeValue | |||
C_SetAttributeValue | |||
C_FindObjectsInit | |||
C_FindObjects | |||
認証 | Cert*** | GSS_Acquire_cred | C_InitPIN |
(26 Functions) | GS_Release_cred | C_SetPIN | |
GSS_Inquire_cred | C_Login | ||
GSS_Add_cred | C_Logout | ||
GSS_Inquire_cred_by_mech | |||
暗号化・復号 | CryptEncrypt | GSS_Wrap | C_EncryptInit |
CryptDecrypt | GSS_Unwrap | C_Encrypt | |
CryptEncryptMessage | C_EncryptUpdate | ||
CryptDecryptMessage | C_EncryptFinal | ||
CryptSignAndEncryptMessage | C_DecryptInit | ||
CryptDecryptAndVerifyMessageSignature | C_Decrypt | ||
C_DecryptUpdate | |||
C_DecryptFinal | |||
ダイジェスト | CryptCreateHash | C_DigestInit | |
CryptDestroyHash | C_Digest | ||
CryptGetHashParam | C_DigestUpdate | ||
CryptHashData | C_DigestFinal | ||
CryptHashSessionKey | |||
CryptSetHashParam | |||
ディジタル署名 | CryptSignHash | GSS_GetMIC | C_SignInit |
CryptVerifySIgnature | GSS_VerifyMIC | C_Sign | |
C_SignUpdate | |||
C_SignFinal | |||
C_SignRecoverInit | |||
C_SignRecover | |||
C_Verify\_Init | |||
C_Verify | |||
C_VerifyUpdate | |||
C_VerifyFinal | |||
C_VerifyRecoverInit | |||
C_VerifyRecover | |||
鍵生成 | CryptDeriveKey | C_GenerateKey | |
CryptDestroyKey | C_GenerateKeyPair | ||
CryptExportKey | C_WrapKey | ||
CryptGenKey | C_UnwrapKey | ||
CryptGetKeyParam | C_DeriveKey | ||
CryptGetUserKey | |||
CryptImportKey | |||
CryptSetKeyParam | |||
乱数生成 | CryptGenRandom | C_SeedRandom | |
C_GenerateRandom | |||
その他 | CryptEncodeObject | GSS_Display_status, etc | C_getFunctionStatus |
CryptDecodeObject | (19 Functions) | C_CancelFunction |
Java Security API は,Javaにおける暗号認証機能を実現するAPIであり,Sun Microsytems から仕様が公開され,Java におけるデファクトスタンダードとなっている. この API は,基本となる API の枠組を抽象クラスとして与えるもので,具体的な暗号認証アルゴリズムに対応した実装はソフトウェアベンダが任意に組み込むことができる (Providerクラスとして組み込む).Sun Microsystens の提供する JDK にもデフォルトの実装として,ハッシュ関数やディジタル署名などの暗号認証機能が組み込まれている.
詳細は, Java Security API を参照のこと.