1.数字签名简介
数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名,就是对要发送的消息的消息摘要(md5 sha)使用私钥加密后的字符串。
数字签名是非对称密钥加密技术与数字摘要技术的综合应用。
签名过程:
“发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要
进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一
样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签
名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。
数字签名有两种功效:
一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的
签名。
二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改
变,数字摘要的值也将发生变化。不同的文件将得到不同的数字摘要。 一次数字签名涉及到一个哈希函
数、发送者的公钥、发送者的私钥。”
![](https://box.kancloud.cn/ccd0212722b3cb29afe5ee560e80cfce_874x532.jpg)
2.数字签名的实现
~~~
1. package com;
2.
3. import java.security.InvalidKeyException;
4. import java.security.KeyPair;
5. import java.security.KeyPairGenerator;
6. import java.security.NoSuchAlgorithmException;
7. import java.security.PrivateKey;
8. import java.security.PublicKey;
9. import java.security.Signature;
10. import java.security.SignatureException;
11.
12. public class SignatureTest {
13. public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException,
14. SignatureException {
15. String contentString = "你好黑马!";
16. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
17. KeyPair keyPair = keyPairGenerator.generateKeyPair();
18. PrivateKey privateKey = keyPair.getPrivate();
19.
20. PublicKey public1Key= keyPair.getPublic();
21.
22. byte[] signature = getSignature(privateKey, contentString);
23.
24. boolean verifySign = verifySign(contentString, signature, public1Key);
25. if (verifySign) {
26. System.out.println("验证通过");
27. }
28.
29. }
30.
31. public static byte[] getSignature(PrivateKey privateKey,String content) throws
32. NoSuchAlgorithmException, InvalidKeyException, SignatureException {
33.
34. Signature signature = Signature.getInstance("MD5withRSA");
35. signature.initSign(privateKey);
36. signature.update(content.getBytes());
37. byte[] sign = signature.sign();
38.
39. return sign;
40. }
41.
42. public static boolean verifySign(String content,byte[] sign,PublicKey publicKey) throws
43. NoSuchAlgorithmException, InvalidKeyException, SignatureException{
44. Signature signature = Signature.getInstance("MD5withRSA");
45. signature.initVerify(publicKey);
46. signature.update(content.getBytes());
47. return signature.verify(sign);
48. }
49. }
~~~
数字签名一般不单独使用,基本都是用在数字证书里实现 SSL 通信协议。下面将学习的数字证书就是基于数字签名技术实现的。