国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - Java教程 - 淺析java消息摘要與數(shù)字簽名

淺析java消息摘要與數(shù)字簽名

2021-05-26 13:43靜默虛空 Java教程

這篇文章給大家分析了關(guān)于java消息摘要與數(shù)字簽名的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。

消息摘要

算法簡述

定義

它是一個(gè)唯一對應(yīng)一個(gè)消息或文本的固定長度的值,它由一個(gè)單向hash加密函數(shù)對消息進(jìn)行作用而產(chǎn)生。如果消息在途中改變了,則接收者通過對收到消息的新產(chǎn)生的摘要與原摘要比較,就可知道消息是否被改變了。因此消息摘要保證了消息的完整性。消息摘要采用單向hash 函數(shù)將需加密的明文"摘要"成一串密文,這一串密文亦稱為數(shù)字指紋(finger print)。它有固定的長度,且不同的明文摘要成密文,其結(jié)果總是不同的,而同樣的明文其摘要必定一致。這樣這串摘要便可成為驗(yàn)證明文是否是"真身"的"指紋"了。

特點(diǎn)

消息摘要具有以下特點(diǎn):

(1)唯一性:數(shù)據(jù)只要有一點(diǎn)改變,那么再通過消息摘要算法得到的摘要也會(huì)發(fā)生變化。雖然理論上有可能會(huì)發(fā)生碰撞,但是概率極其低。

(2)不可逆:消息摘要算法的密文無法被解密。

(3)不需要密鑰,可使用于分布式網(wǎng)絡(luò)。

(4)無論輸入的明文有多長,計(jì)算出來的消息摘要的長度總是固定的。

原理

消息摘要,其實(shí)就是將需要摘要的數(shù)據(jù)作為參數(shù),經(jīng)過哈希函數(shù)(hash)的計(jì)算,得到的散列值。

常用算法

消息摘要算法包括md(message digest,消息摘要算法)、sha(secure hash algorithm,安全散列算法)、mac(message authenticationcode,消息認(rèn)證碼算法)共3大系列,常用于驗(yàn)證數(shù)據(jù)的完整性,是數(shù)字簽名算法的核心算法。

md5和sha1分別是md、sha算法系列中最有代表性的算法。

如今,md5已被發(fā)現(xiàn)有許多漏洞,從而不再安全。sha算法比md算法的摘要長度更長,也更加安全。

算法實(shí)現(xiàn)

md5、sha的范例

jdk中使用md5和sha這兩種消息摘要的方式基本一致,步驟如下:

(1)初始化messagedigest對象

(2)更新要計(jì)算的內(nèi)容

(3)生成摘要

java" id="highlighter_473988">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
importjava.io.unsupportedencodingexception;
import java.security.messagedigest;
import java.security.nosuchalgorithmexception;
 
import org.apache.commons.codec.binary.base64;
 
public class msgdigestdemo{
 public static void main(string args[]) throws nosuchalgorithmexception, unsupportedencodingexception {
  string msg = "hello world!";
 
  messagedigest md5digest = messagedigest.getinstance("md5");
  // 更新要計(jì)算的內(nèi)容
  md5digest.update(msg.getbytes());
  // 完成哈希計(jì)算,得到摘要
  byte[] md5encoded = md5digest.digest();
 
  messagedigest shadigest = messagedigest.getinstance("sha");
  // 更新要計(jì)算的內(nèi)容
  shadigest.update(msg.getbytes());
  // 完成哈希計(jì)算,得到摘要
  byte[] shaencoded = shadigest.digest();
 
  system.out.println("原文: " + msg);
  system.out.println("md5摘要: " + base64.encodebase64urlsafestring(md5encoded));
  system.out.println("sha摘要: " + base64.encodebase64urlsafestring(shaencoded));
 }
}

結(jié)果:

原文:hello world!
md5摘要: 7qdih1muhjzehb6sv8unja
sha摘要:lve95gjovatpfv8el5x4nxwjkhe

hmac的范例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
importjavax.crypto.mac;
import javax.crypto.spec.secretkeyspec;
 
import org.apache.commons.codec.binary.base64;
 
public class hmaccoder{
 /**
  * jdk支持hmacmd5, hmacsha1,hmacsha256, hmacsha384, hmacsha512
  */
 public enum hmactypeen {
  hmacmd5, hmacsha1, hmacsha256, hmacsha384, hmacsha512;
 }
 
 public static byte[] encode(byte[] plaintext, byte[] secretkey, hmactypeen type) throwsexception {
  secretkeyspec keyspec = new secretkeyspec(secretkey, type.name());
  mac mac = mac.getinstance(keyspec.getalgorithm());
  mac.init(keyspec);
  return mac.dofinal(plaintext);
 }
 
 public static void main(string[] args) throws exception {
  string msg = "hello world!";
  byte[] secretkey = "secret_key".getbytes("utf8");
  byte[] digest = hmaccoder.encode(msg.getbytes(), secretkey, hmactypeen.hmacsha256);
  system.out.println("原文: " + msg);
  system.out.println("摘要: " + base64.encodebase64urlsafestring(digest));
 }
}

結(jié)果:

原文:hello world!
摘要: b8-euifaoj5oufweooq08hbgamsipc3nt-yv-s91yr4

數(shù)字簽名

算法簡述

數(shù)字簽名算法可以看做是一種帶有密鑰的消息摘要算法,并且這種密鑰包含了公鑰和私鑰。也就是說,數(shù)字簽名算法是非對稱加密算法和消息摘要算法的結(jié)合體。

特點(diǎn)

數(shù)字簽名算法要求能夠驗(yàn)證數(shù)據(jù)完整性、認(rèn)證數(shù)據(jù)來源,并起到抗否認(rèn)的作用。

原理

數(shù)字簽名算法包含簽名和驗(yàn)證兩項(xiàng)操作,遵循私鑰簽名,公鑰驗(yàn)證的方式。

簽名時(shí)要使用私鑰和待簽名數(shù)據(jù),驗(yàn)證時(shí)則需要公鑰、簽名值和待簽名數(shù)據(jù),其核心算法主要是消息摘要算法。

淺析java消息摘要與數(shù)字簽名

常用算法

rsa、dsa、ecdsa

算法實(shí)現(xiàn)

dsa的范例

數(shù)字簽名有兩個(gè)流程:簽名和驗(yàn)證。

它們的前提都是要有一個(gè)公鑰、密鑰對。

簽名

用私鑰為消息計(jì)算簽名

驗(yàn)證

用公鑰驗(yàn)證摘要

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
importjava.security.keyfactory;
import java.security.keypair;
import java.security.keypairgenerator;
import java.security.privatekey;
import java.security.publickey;
import java.security.signature;
import java.security.spec.pkcs8encodedkeyspec;
import java.security.spec.x509encodedkeyspec;
 
import org.apache.commons.codec.binary.base64;
 
public class dsacoder{
 public static final string key_algorithm = "dsa";
 
 public enum dsatypeen {
  md5withdsa, sha1withdsa
 }
 
 /**
  * dsa密鑰長度默認(rèn)1024位。 密鑰長度必須是64的整數(shù)倍,范圍在512~1024之間
  */
 private static final int key_size = 1024;
 
 private keypair keypair;
 
 public dsacoder() throws exception {
  keypair = initkey();
 }
 
 public byte[] signature(byte[] data, byte[] privatekey) throws exception {
  pkcs8encodedkeyspec keyspec = new pkcs8encodedkeyspec(privatekey);
  keyfactory keyfactory = keyfactory.getinstance(key_algorithm);
  privatekey key =keyfactory.generateprivate(keyspec);
 
  signature signature = signature.getinstance(dsatypeen.sha1withdsa.name());
  signature.initsign(key);
  signature.update(data);
  return signature.sign();
 }
 
 public boolean verify(byte[] data, byte[] publickey, byte[] sign) throws exception {
  x509encodedkeyspec keyspec = new x509encodedkeyspec(publickey);
  keyfactory keyfactory = keyfactory.getinstance(key_algorithm);
  publickey key =keyfactory.generatepublic(keyspec);
 
  signature signature = signature.getinstance(dsatypeen.sha1withdsa.name());
  signature.initverify(key);
  signature.update(data);
  return signature.verify(sign);
 }
 
 private keypair initkey() throws exception {
  // 初始化密鑰對生成器
  keypairgenerator keypairgen = keypairgenerator.getinstance(key_algorithm);
  // 實(shí)例化密鑰對生成器
  keypairgen.initialize(key_size);
  // 實(shí)例化密鑰對
  return keypairgen.genkeypair();
 }
 
 public byte[] getpublickey() {
  return keypair.getpublic().getencoded();
 }
 
 public byte[] getprivatekey() {
  return keypair.getprivate().getencoded();
 }
 
 public static void main(string[] args) throws exception {
  string msg = "hello world";
  dsacoder dsa = new dsacoder();
  byte[] sign = dsa.signature(msg.getbytes(), dsa.getprivatekey());
  boolean flag = dsa.verify(msg.getbytes(), dsa.getpublickey(), sign);
  string result = flag ? "數(shù)字簽名匹配" : "數(shù)字簽名不匹配";
  system.out.println("數(shù)字簽名:" + base64.encodebase64urlsafestring(sign));
  system.out.println("驗(yàn)證結(jié)果:" + result);
 }
}

參考

《core java volume2》

《java加密與解密技術(shù)》

原文鏈接:https://www.cnblogs.com/jingmoxukong/p/5700906.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产中文字幕一区 | 日韩精品影院 | 一区二区三区日韩 | 北条麻妃一区二区免费播放 | 一区二区在线不卡 | 成人免费视频网 | 黄色一级片在线观看 | 国产在线一区二区 | 日韩和的一区二在线 | 高清中文字幕 | 日韩av中文字幕在线播放 | 国产伦精品一区二区三区高清 | 国产高清精品在线 | 国产在线精品一区 | 国产免费爽爽视频在线观看 | 亚洲国产精品自拍 | 成人网av| 中文字幕在线电影观看 | 91免费观看视频 | 日韩在线电影一区 | 免费成人黄色大片 | 国产高清免费 | 欧美综合一区 | 探花在线观看 | 久久久久久久久久久免费av | 干片网| 久久久久亚洲精品 | 综合久久网| 亚洲国产传媒99综合 | 精品国产子伦久久久久久小说 | 久久久久久成人 | 久久久九九 | 久久精品视频网站 | 中文字幕亚洲一区二区三区 | 日韩免费一区 | 黄色小视频在线观看 | 欧美亚洲综合久久 | 99免费视频 | 操操操av| 二区三区在线观看 | 91久久在线观看 |