java.lang.Object
java.security.SignedObject
- 所有已实现的接口:
-
Serializable
SignedObject
是用于创建无法在未被检测到的情况下被篡改的真实运行时对象的类。
更具体地说,SignedObject
包含另一个可序列化对象,即(待)签名对象及其签名。
签名对象是原始对象的“深度复制”(以序列化形式)。一旦复制完成,对原始对象的进一步操作不会对复制品产生任何副作用。
签名算法由传递给构造函数和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,以尝试绕过安全检查。
签名算法可以是NIST标准DSA,使用DSA和SHA-256等。算法的指定方式与签名相同。例如,可以指定使用SHA-256消息摘要算法的DSA算法为“SHA256withDSA”。在RSA的情况下,签名算法可以指定为“SHA256withRSA”。必须指定算法名称,因为没有默认值。
加密包提供程序的名称也由传递给构造函数和verify
方法的Signature参数指定。如果未指定提供程序,则使用默认提供程序。每个安装可以配置为使用特定提供程序作为默认提供程序。
SignedObject
的潜在应用包括:
- 它可以在任何Java运行时内部用作不可伪造的授权令牌 - 可以在不担心令牌可能被恶意修改而不被检测到的情况下传递。
- 它可以用于对数据/对象进行签名和序列化,以便在Java运行时之外进行存储(例如,在磁盘上存储关键访问控制数据)。
- 嵌套的SignedObjects可用于构建签名的逻辑序列,类似于授权和委托链。
- 自版本:
- 1.2
- 参见:
-
Constructor Summary
ConstructorDescriptionSignedObject
(Serializable object, PrivateKey signingKey, Signature signingEngine) 从任何可序列化对象构造SignedObject
。 -
Method Summary
Modifier and TypeMethodDescription检索签名算法的名称。检索封装的对象。byte[]
检索签名对象的签名,以字节数组形式。boolean
验证此SignedObject
中的签名是否是使用指定的验证密钥和指定的验证引擎对内部存储的对象进行有效签名。
-
Constructor Details
-
SignedObject
public SignedObject(Serializable object, PrivateKey signingKey, Signature signingEngine) throws IOException, InvalidKeyException, SignatureException 从任何可序列化对象构造SignedObject
。给定对象使用给定的签名密钥使用指定的签名引擎进行签名。- 参数:
-
object
- 要签名的对象。 -
signingKey
- 用于签名的私钥。 -
signingEngine
- 签名签名引擎。 - 抛出:
-
IOException
- 如果在序列化过程中发生错误 -
InvalidKeyException
- 如果密钥无效。 -
SignatureException
- 如果签名失败。
-
-
Method Details
-
getObject
检索封装的对象。在返回之前,封装的对象将被反序列化。- 返回:
- 封装的对象。
- 抛出:
-
IOException
- 如果在反序列化过程中发生错误 -
ClassNotFoundException
- 如果在反序列化过程中发生错误
-
getSignature
public byte[] getSignature()检索签名对象的签名,以字节数组形式。- 返回:
- 签名。每次调用此方法时都会返回一个新数组。
-
getAlgorithm
检索签名算法的名称。- 返回:
- 签名算法名称。
-
verify
public boolean verify(PublicKey verificationKey, Signature verificationEngine) throws InvalidKeyException, SignatureException 验证此SignedObject
中的签名是否是使用指定的验证密钥和指定的验证引擎对内部存储的对象进行有效签名。- 参数:
-
verificationKey
- 用于验证的公钥。 -
verificationEngine
- 签名验证引擎。 - 返回:
-
如果签名有效,则返回
true
,否则返回false
- 抛出:
-
SignatureException
- 如果签名验证失败(异常阻止了签名验证引擎正常完成)。 -
InvalidKeyException
- 如果验证密钥无效。
-