目次|前|次 |
基本的な考え方は、リソースの供給者がリソースを表すオブジェクトを作成し、リソース・オブジェクトを内部に組み込むGuardedObjectを作成し、それからGuardedObjectを消費者に提供するというものです。GuardedObjectの作成時に供給者もGuardオブジェクトを指定し、Guardオブジェクト内部のセキュリティ・チェックの条件が満たされた場合にだけ、消費者を含むどこからでもリソース・オブジェクトを取得できるように設定します。
Guardは、インタフェースなので、どんなオブジェクトもGuardにすることができます。このインタフェースの唯一のメソッドは、checkGuard
です。これは、Object引数を取得し、特定のセキュリティ・チェックを実行します。java.securityのPermissionクラスは、Guardインタフェースを実装します。
たとえば、システム・スレッドが/a/b/c.txtというファイルを読取りアクセス用に開くよう要求されたが、システム・スレッドは、だれが要求したのか、どんな状況で要求が行われたのかわからないとします。このため、サーバー側では、正確なアクセス制御の決定を行えません。システム・スレッドは、次に示すように、GuardedObjectを使用してアクセス制御チェックを遅延させることができます。
FileInputStream f = new FileInputStream("/a/b/c.txt"); FilePermission p = new FilePermission("/a/b/c.txt", "read"); GuardedObject g = new GuardedObject(f, p);これでシステム・スレッドは、gを消費者スレッドに渡すことができます。そのスレッドがファイル入力ストリームを取得するには、次のメソッドを呼び出す必要があります。
FileInputStream fis = (FileInputStream) g.getObject();次にこのメソッドは、Guardオブジェクトpで
checkGuard
メソッドを呼び出します。pはPermissionなので、checkGuard
メソッドは実際には次のようになります。
SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(this);これにより、適切なアクセス制御検査が消費者コンテキスト内で確実に実行されます。事実、頻繁に使用されるハッシュ表およびアクセス制御の一覧は、多くの場合置き換えられ、GuardedObjectのハッシュ表が保存されます。
GuardedObjectおよびGuardのこの基本的なパターンは、非常に一般的です。GuardおよびGuardedObjectの基本クラスを拡張することにより、開発者が強力なアクセス制御ツールを容易に入手できることを期待します。たとえば、メソッドごとの呼出しは、各メソッドの適切なGuardにより実現でき、Guardは時間、署名者、またはその他の呼出し側の識別情報、またはその他の関連情報をチェックできます。
GuardedObjectがオブジェクトを返すため、ある種の型情報が失われます。GuardedObjectは、連携するパーティ間で使用することを意図して設計されているため、受け取り側は受け取る(またはキャストする)オブジェクトの種類を知る必要があります。実際、GuardedObjectの一般的な使用法として、それをサブクラス化する(GuardedFileInputStreamクラスの形成など)ことが想定されているため、入力情報のカプセル化およびキャストは、サブクラス内で適切に実行できます。
基礎となる署名アルゴリズムは、sign
メソッド呼出しへのパラメータとしてのSignatureオブジェクトによって設定し、アルゴリズムは、特にDSAおよびSHA-1を使用するNIST標準DSAなどになります。「SHA/DSA」など、署名の同じ規則を使用してアルゴリズムを指定します。
署名付きオブジェクトは、元のオブジェクトの直列化された形式での「精密なコピー」です。ひとたびコピーが作成されると、元のオブジェクトをさらに操作してもコピーに影響が及ぶことはありません。署名付きのオブジェクトは、不変のオブジェクトです。
Signature signingEngine = Signature.getInstance(algorithm,provider); SignedObject so = new SignedObject(myobject, signingKey, signingEngine);検査の一般的な例(SignedObjectである
so
を受け取る)は、次のとおりです。アルゴリズム名がわかっている場合は、最初の行は必要ありません。
String algorithm = so.getAlgorithm(); Signature verificationEngine = Signature.getInstance(algorithm, provider); so.verify(verificationEngine);SignedObjectを使用するアプリケーションでは、次のことが行えます。
get
メソッドも一意の値を返します。複数の署名がある場合には、一連の署名の中から任意の署名を1つ返します。