java.security

接口
异常
java.lang.Object
  继承者 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 方法允许使用自定义的签名引擎,这样可以实现未作为加密提供者一部分正常安装的签名算法。不过,编程人员编写知道使用什么 Signature 引擎的校验器代码至关重要,因为将调用它自己的 verify 方法的实现来验证签名。换句话说,恶意 Signature 在尝试绕过安全检查的验证中会选择始终返回 true。

在所有算法中,签名算法可以是使用 DSA 和 SHA-1 的 NIST 标准 DSA。该算法使用与签名惯例相同的惯例来指定。例如,可以将使用 SHA-1 消息分类算法的 DSA 算法指定为 "SHA/DSA" 或 "SHA-1/DSA"(它们是等效的)。如果使用 RSA 标准,消息分类算法将有多种选择,例如,可将签名算法指定为 "MD2/RSA"、"MD5/RSA" 或 "SHA-1/RSA"。没有默认的算法名称,所以必须为其指定名称。

Cryptography Package Provider 的名称也是由构造方法和 verify 方法的 Signature 参数指定的。如果未指定提供者,则使用默认的提供者。每种安装都可以配置为将特定的提供者作为默认提供者。

SignedObject 可能的应用领域包括:

  • 可将它内部用作任何 Java 运行时的不可遗忘的授权标记 -- 这种标记可以到处传递而不必担心其被恶意修改而又检测不到。
  • 可使用它来为 Java 运行时之外(例如,磁盘上存储的关键访问控制数据)的存储签名和序列化数据/对象。
  • 嵌套的 SignedObject 可用来构造签名的逻辑序列,以模拟一系列授权和委托。

另请参见:
Signature, 序列化表格

构造方法摘要
SignedObject(Serializable object, PrivateKey signingKey, Signature signingEngine)
          通过任何可序列化对象构造 SignedObject。
 
方法摘要
 String getAlgorithm()
          获取签名算法的名称。
 Object getObject()
          获取已封装的对象。
 byte[] getSignature()
          在已签名对象上按 byte 数组的形式获取签名。
 boolean verify(PublicKey verificationKey, Signature verificationEngine)
          使用指派的验证引擎,通过给定的验证密钥验证此 SignedObject 中的签名是否为内部存储对象的有效签名。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

SignedObject

public SignedObject(Serializable object,
                    PrivateKey signingKey,
                    Signature signingEngine)
             throws IOException,
                    InvalidKeyException,
                    SignatureException
通过任何可序列化对象构造 SignedObject。使用指派的签名引擎,通过给定的签名密钥将给定的对象签名。

参数:
object - 要签名的对象。
signingKey - 用于签名的私钥。
signingEngine - 用于签名的签名引擎。
抛出:
IOException - 如果在序列化期间发生错误
InvalidKeyException - 如果密钥无效。
SignatureException - 如果签名失败。
方法详细信息

getObject

public Object getObject()
                 throws IOException,
                        ClassNotFoundException
获取已封装的对象。在返回已封装的对象之前要先对它反序列化。

返回:
已封装的对象。
抛出:
IOException - 如果在反序列化期间发生错误
ClassNotFoundException - 如果在反序列化期间发生错误

getSignature

public byte[] getSignature()
在已签名对象上按 byte 数组的形式获取签名。

返回:
签名。每次调用此方法时都返回一个新的数组。

getAlgorithm

public String getAlgorithm()
获取签名算法的名称。

返回:
签名算法名称。

verify

public boolean verify(PublicKey verificationKey,
                      Signature verificationEngine)
               throws InvalidKeyException,
                      SignatureException
使用指派的验证引擎,通过给定的验证密钥验证此 SignedObject 中的签名是否为内部存储对象的有效签名。

参数:
verificationKey - 用于验证的公钥。
verificationEngine - 签名验证引擎。
返回:
如果签名有效,则返回 true,否则返回 false
抛出:
SignatureException - 如果签名验证失败。
InvalidKeyException - 如果验证密钥无效。