java.lang.Object java.security.SignedObject
public final class SignedObject
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 可能的应用领域包括:
构造方法摘要 | |
---|---|
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 |
构造方法详细信息 |
---|
public SignedObject(Serializable object, PrivateKey signingKey, Signature signingEngine) throws IOException, InvalidKeyException, SignatureException
object
- 要签名的对象。
signingKey
- 用于签名的私钥。
signingEngine
- 用于签名的签名引擎。
IOException
- 如果在序列化期间发生错误
InvalidKeyException
- 如果密钥无效。
SignatureException
- 如果签名失败。
方法详细信息 |
---|
public Object getObject() throws IOException, ClassNotFoundException
IOException
- 如果在反序列化期间发生错误
ClassNotFoundException
- 如果在反序列化期间发生错误
public byte[] getSignature()
public String getAlgorithm()
public boolean verify(PublicKey verificationKey, Signature verificationEngine) throws InvalidKeyException, SignatureException
verificationKey
- 用于验证的公钥。
verificationEngine
- 签名验证引擎。
SignatureException
- 如果签名验证失败。
InvalidKeyException
- 如果验证密钥无效。