Java签名

时间:2020-01-09 10:35:55  来源:igfitidea点击:

Java Signature类(java.security.Signature)可以为二进制数据创建数字签名。数字签名是使用私钥/公钥对的私钥加密的消息摘要。拥有公钥的任何人都可以验证数字签名。

创建签名实例

必须先创建一个Signature实例,然后才能使用Java Signature类。我们可以通过调用静态的getInstance()方法来创建一个Signature实例。这是一个创建JavaSignature实例的示例:

Signature signature = Signature.getInstance("SHA256WithDSA");

作为参数传递给getInstance()方法的String是要使用的数字签名算法的名称。

初始化签名实例

创建JavaSignature实例后,需要先对其进行初始化,然后才能使用它。我们可以通过调用init()方法来初始化一个Signature实例。这是一个JavaSignature初始化示例:

SecureRandom secureRandom = new SecureRandom();
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
KeyPair keyPair = keyPairGenerator.generateKeyPair();

signature.initSign(keyPair.getPrivate(), secureRandom);

如我们所见,"签名"实例是使用私钥/公钥对的私钥和" SecureRandom"实例初始化的。

创建数字签名

签名实例初始化后,我们可以使用它创建数字签名。我们可以通过多次调用update()方法来创建数字签名,最后再调用sign()。这是为二进制数据块创建数字签名的示例:

byte[] data = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8");
signature.update(data);

byte[] digitalSignature = signature.sign();

验证数字签名

如果要验证其他人创建的数字签名,则必须将"签名"实例初始化为验证模式(而不是签名模式)。这是将"签名"实例初始化为验证模式的样子:

Signature signature = Signature.getInstance("SHA256WithDSA");

signature.initVerify(keyPair.getPublic());

请注意,现在如何将JavaSignature实例初始化为验证模式,并传递公钥/私钥对中的公钥作为参数。

初始化为验证模式后,我们可以使用"签名"实例来验证数字签名。这是验证数字签名的样子:

byte[] data2 = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8");
signature2.update(data2);

boolean verified = signature2.verify(digitalSignature);