モジュール java.base
パッケージ java.security

クラスSignedObject

  • すべての実装されたインタフェース:
    Serializable

    public final class SignedObject
    extends Object
    implements Serializable

    SignedObjectは、認証実行時オブジェクトの作成を目的としたクラスです。この実行時オブジェクトの整合性が損なわれた場合は、必ず検出されます。

    より具体的には、SignedObjectは、別のSerializableオブジェクト、署名付きオブジェクト、およびその署名を保持します。

    署名付きオブジェクトは、元のオブジェクトの直列化された形式での精密なコピーです。 ひとたびコピーが作成されると、元のオブジェクトをさらに操作してもコピーに影響が及ぶことはありません。

    基になる署名アルゴリズムは、コンストラクタとverifyメソッドに渡されるSignatureオブジェクトによって指定されます。 次に、署名の一般的な使い方を示します。

    
     Signature signingEngine = Signature.getInstance(algorithm,
                                                     provider);
     SignedObject so = new SignedObject(myobject, signingKey,
                                        signingEngine);
     

    次に、検証の一般的な使い方を示します(SignedObject soを受け取っています)。

    
     Signature verificationEngine =
         Signature.getInstance(algorithm, provider);
     if (so.verify(publickey, verificationEngine))
         try {
             Object myobj = so.getObject();
         } catch (java.lang.ClassNotFoundException e) {};
     

    留意点をいくつか挙げます。 最初に、署名エンジンや検証エンジンはコンストラクタとverifyメソッド内で再初期化されるので、それらのエンジンを初期化する必要はありません。 次に、検証を成功させるには、指定された公開鍵が、SignedObjectを生成するのに使う非公開鍵に一致していなければいけません。

    さらに重要なのは、柔軟性です。コンストラクタとverifyメソッドはカスタマイズされた署名エンジンにより、暗号プロバイダの一部として正式にインストールされていない署名アルゴリズムを実装できます。 ただし、署名の検証にはverifyメソッドのSignatureエンジン自身の実装が呼び出されるので、検証用コードを記述するプログラマは、どのSignatureエンジンが使用中であるかを確認することが重要です。 言い換えれば、悪意のあるSignatureはセキュリティ・チェックを免れるために検証で常にtrueを返そうとする場合があります。

    シグネチャ・アルゴリズムは、とりわけDSAとSHA-256を使用するNIST標準DSAとすることができます。 アルゴリズムは、署名と同じ規約を使って指定されます。 SHA-256メッセージ・ダイジェスト・アルゴリズムを使用するDSAアルゴリズムは、たとえば"SHA256withDSA"として指定できます。 RSAの場合、署名アルゴリズムは、例えば、"SHA256withRSA"として指定することができます。 デフォルトはないので、必ずアルゴリズムの名前を指定しなければいけません。

    暗号パッケージ・プロバイダの名前は、コンストラクタとverifyメソッドに対するSignatureパラメータで指定されます。 このプロバイダを指定しないと、デフォルトのプロバイダが使用されます。 各インストールは、特定プロバイダをデフォルトとして使うように構成できます。

    SignedObjectを使用するアプリケーションでは、次のことが行えます。

    • 改ざんが不可能な承認トークンとしてどのJava実行時に対しても内部的に使用できる。悪質な改ざんは必ず検出されるので、このトークンは安心して渡すことができる。
    • Java実行時以外に格納する(重要なアクセス制御データをディスクに格納するなど)ために、データやオブジェクトに署名し、それらを直列化するために使用できる。
    • 入れ子のSignedObjectsを使うと、承認と委譲の連鎖に類似した、署名の論理シーケンスを構築できる。
    導入されたバージョン:
    1.2
    関連項目:
    Signature, 直列化された形式
    • コンストラクタの詳細

      • SignedObject

        public SignedObject​(Serializable object,
                            PrivateKey signingKey,
                            Signature signingEngine)
                     throws IOException,
                            InvalidKeyException,
                            SignatureException
        任意のSerializableオブジェクトからSignedObjectを構築します。 指定されたオブジェクトは、指定された署名エンジンを使って、指定された署名鍵で署名されます。
        パラメータ:
        object - 署名対象のオブジェクト。
        signingKey - 署名のための非公開鍵。
        signingEngine - 署名エンジン。
        例外:
        IOException - 直列化でエラーが発生した場合
        InvalidKeyException - 鍵が無効な場合。
        SignatureException - 署名が失敗した場合。
    • メソッドの詳細

      • getObject

        public Object getObject()
                         throws IOException,
                                ClassNotFoundException
        カプセル化されたオブジェクトを取得します。 このオブジェクトは、復帰する前に直列化が復元されます。
        戻り値:
        カプセル化されたオブジェクト。
        例外:
        IOException - 直列化復元でエラーが発生した場合
        ClassNotFoundException - 直列化復元でエラーが発生した場合
      • getSignature

        public byte[] getSignature()
        署名付きオブジェクトの署名を、バイト配列の形式で取得します。
        戻り値:
        シグネチャ。 このメソッドが呼び出されるたびに新しい配列を返す。
      • getAlgorithm

        public String getAlgorithm()
        署名アルゴリズムの名前を取得します。
        戻り値:
        署名アルゴリズム名
      • verify

        public boolean verify​(PublicKey verificationKey,
                              Signature verificationEngine)
                       throws InvalidKeyException,
                              SignatureException
        このSignedObject内の署名が、内部に格納されたオブジェクトの有効な署名かどうかを、指定された検証エンジンを使って、指定された検証鍵で検証します。
        パラメータ:
        verificationKey - 検証用の公開鍵。
        verificationEngine - 署名検証エンジン。
        戻り値:
        署名が有効な場合はtrue、そうでない場合はfalse
        例外:
        SignatureException - シグネチャの検証に失敗した場合は(例外により、シグネチャ検証エンジンが正常に完了しませんでした)。
        InvalidKeyException - 検証鍵が無効な場合。