- java.lang.Object
-
- java.security.SignedObject
-
- All Implemented Interfaces:
-
Serializable
public final class SignedObject extends Object implements Serializable
SignedObject是一个类,用于创建可靠的运行时对象,其完整性不会受到威胁,而不会被检测到。
更具体地说,SignedObject包含另一个Serializable对象,即(待签名)对象及其签名。
签名对象是原始对象的“深层副本”(以序列化形式)。 一旦复制完成,对原始对象的进一步操纵对副本没有副作用。
底层签名算法由传递给构造函数的签名对象和
verify
方法指定。 用于签名的典型用法如下: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-1。 该算法使用与签名相同的约定来指定。 使用SHA-1消息摘要算法的DSA算法可以被指定为例如“SHA / DSA”或“SHA-1 / DSA”(它们是等效的)。 在RSA的情况下,消息摘要算法有多种选择,因此签名算法可以被指定为例如“MD2 / RSA”,“MD5 / RSA”或“SHA-1 / RSA”。 必须指定算法名称,因为没有默认值。
Cryptography Package Provider的名称也由构造函数的Signature参数和
verify
方法指定。 如果未指定提供程序,则使用默认提供程序。 默认情况下,每个安装都可以配置为使用特定的提供者。SignedObject的潜在应用包括:
- 它可以在内部使用任何Java运行时作为一个不可伪造的授权令牌 - 可以传递的令牌,而不用担心令牌可能被恶意修改而不被检测到。
- 它可以用于在Java运行时间之外对数据/对象进行签名和序列化(例如,将重要的访问控制数据存储在磁盘上)。
- 嵌套SignedObject可用于构建类似于授权和授权链的签名的逻辑序列。
- 从以下版本开始:
- 1.2
- 另请参见:
-
Signature
, Serialized Form
-
-
构造方法摘要
构造方法 Constructor 描述 SignedObject(Serializable object, PrivateKey signingKey, Signature signingEngine)
从任何可序列化对象构造一个SignedObject。
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 String
getAlgorithm()
检索签名算法的名称。Object
getObject()
检索封装对象。byte[]
getSignature()
以一个字节数组的形式检索签名对象上的签名。boolean
verify(PublicKey verificationKey, Signature verificationEngine)
验证此SignedObject中的签名是使用指定的验证引擎使用给定的验证密钥存储在其中的对象的有效签名。
-
-
-
构造方法详细信息
-
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()
以一个字节数组的形式检索签名对象上的签名。- 结果
- 签名。 每次调用此方法时都会返回一个新数组。
-
getAlgorithm
public String getAlgorithm()
检索签名算法的名称。- 结果
- 签名算法名称。
-
verify
public boolean verify(PublicKey verificationKey, Signature verificationEngine) throws InvalidKeyException, SignatureException
验证此SignedObject中的签名是使用指定的验证引擎使用给定的验证密钥存储在其中的对象的有效签名。- 参数
-
verificationKey
- 验证公钥。 -
verificationEngine
- 签名验证引擎。 - 结果
-
true
如果签名是有效的,false
否则 - 异常
-
SignatureException
- 如果签名验证失败(异常阻止签名验证引擎正常完成)。 -
InvalidKeyException
- 验证键是否无效。
-
-