Java Security API

Java Security API は,Java における暗号認証機能を実現する API であり,Sun Microsytems (Oracle に吸収合併) から仕様が公開され,Java におけるデファクトスタンダードとなっている. この API は,基本となる API の枠組を抽象クラスとして与えるもので,具体的な暗号認証アルゴリズムに対応した実装はソフトウェアベンダが任意に組み込むことができる (Providerクラスとして組み込む).Sun Microsystens の提供する JDK/JRE にもデフォルトの実装として,ハッシュ関数やディジタル署名などの暗号認証機能が組み込まれている.

Java Security パッケージ

java.security パッケージの構成を以下に示す.

ここでは,一連の暗号認証機能(鍵生成,ハッシュ関数,ディジタル署名,暗号化・復号,鍵交換)の機能に関するクラスとその使い方を示し,Java Security API の概要を解説する.

鍵ペアの生成 (KeyPairGeneratorクラス)

KeyPairGeneratorクラスは,公開鍵暗号方式における公開鍵と秘密鍵の鍵ペアの生成を行うクラスである.
鍵ペアの生成方法には,アルゴリズム独立型の方法とアルゴリズム特定型の方法の2つがある.この2つの唯一の相違点は,オブジェクトの初期化にある.

上記の KeyPairGeneratorオブジェクトを用いた鍵ペア生成のコーディング例を示す. ここでは,DSAアルゴリズム用の 1024ビット長の鍵ペア(秘密鍵と公開鍵)を作成する. DSAアルゴリズムのパラメータはデフォルト値を使う.

 // KeyPairGeneratorオブジェクトの生成
 KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DSA");

 // KeyPairGeneratorオブジェクトの初期化 (seedは乱数種)
 kpGen.initialize(1024, new Securerandom(seed));

 // 鍵ペアの生成
 KeyPair pair = kpGen.generateKeyPair();

メッセージダイジェスト (MessageDigestクラス)

MessageDigestクラスは,SHA-1 や MD5 のようなメッセージダイジェストを生成する機能を提供するクラスである.任意長の入力(バイト列)を受け取り,ダイジェストまたはハッシュと呼ばれる固定長の出力を生成する.
メッセージダイジェストの生成は次の手順で行う.

上記の MessageDigestオブジェクトを用いたコーディング例を示す. ここでは,SHA-1 アルゴリズムを用いて2つのバイト配列 data1,data2 のダイジェストをバイト配列 hash として求める.

 // MessageDigestオブジェクトの生成
 MessageDigest sha = MessageDigest.getInstance("SHA-1");

 // メッセージの設定
 sha.update(data1);
 sha.update(data2);

 // ダイジェストの取得
 byte hash[] = sha.digest();

署名 (Signatureクラス)

Signatureクラスは,DSA や RSA などアルゴリズムを用いたディジタル署名機能を提供するクラスである.署名アルゴリズムは任意サイズの入力と秘密鍵を受け取り,署名と呼ばれる比較的短いバイト文字列を生成する.
Signatureオブジェクトを使って,データに署名を付けたり,署名が関連データの実際の署名かどうかを検証することができる.

上記の Signatureオブジェクトを用いた署名生成・検証のコーディング例を示す. ここでは,署名・検証用の鍵ペア(秘密鍵と公開鍵)を pair とし,対象データのbyte配列は data としてこれらは別途与えられているものとする.また,署名アルゴリズムとして RSA暗号を用いるものとする.

 // 署名の生成
 Signature sigObj = Signature.getInstance("RSA");

 // 秘密鍵でSignatureオブジェクトを署名用に初期化
 PrivateKey priKey = pair.getPrivate();
 sigObj.initSign(priKey);

 // 署名対象データ(data)の設定と署名生成
 sigObj.update(data);
 byte[] sig = sigObj.sign();

 // 署名の検証
 // 公開鍵で署名オブジェクトを検証用に初期化
 PublicKey pubkey = pair.getPublic();
 sigObj.initVerify(pubKey);

 // 検証対象データ(data)の設定と署名検証
 sigObj.update(data);
 boolean result = sigObj.verify(sig);

 // 検証結果の表示
 System.out.println("Signature verification: " + result);

暗号化 (Cipherクラス)

データの暗号化・復号機能は,Cipherクラスにより行う.Cipherクラスは,任意サイズの入力と鍵を受け取り,暗号化/復号データのバイト文字列を生成する.

鍵交換 (KeyAgreementクラス)

鍵配送(鍵交換)は,2つのエンティティ間で同一の鍵(共通鍵暗号用の鍵)を保有するための手順である.鍵配送(鍵交換)は,KeyAgreeementクラスにより行う.

inserted by FC2 system