1.數字簽名簡介
數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用于鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用于簽名,另一個用于驗證。
數字簽名,就是只有信息的發送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。
數字簽名,就是對要發送的消息的消息摘要(md5 sha)使用私鑰加密后的字符串。
數字簽名是非對稱密鑰加密技術與數字摘要技術的綜合應用。
簽名過程:
“發送報文時,發送方用一個哈希函數從報文文本中生成報文摘要,然后用自己的私人密鑰對這個摘要
進行加密,這個加密后的摘要將作為報文的數字簽名和報文一起發送給接收方,接收方首先用與發送方一
樣的哈希函數從接收到的原始報文中計算出報文摘要,接著再用發送方的公用密鑰來對報文附加的數字簽
名進行解密,如果這兩個摘要相同、那么接收方就能確認該數字簽名是發送方的。
數字簽名有兩種功效:
一是能確定消息確實是由發送方簽名并發出來的,因為別人假冒不了發送方的
簽名。
二是數字簽名能確定消息的完整性。因為數字簽名的特點是它代表了文件的特征,文件如果發生改
變,數字摘要的值也將發生變化。不同的文件將得到不同的數字摘要。 一次數字簽名涉及到一個哈希函
數、發送者的公鑰、發送者的私鑰。”

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 通信協議。下面將學習的數字證書就是基于數字簽名技術實現的。