一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 詳解Java中實(shí)現(xiàn)SHA1與MD5加密算法的基本方法

詳解Java中實(shí)現(xiàn)SHA1與MD5加密算法的基本方法

2020-04-14 11:44匆忙擁擠repeat JAVA教程

這篇文章主要介紹了詳解Java中實(shí)現(xiàn)SHA1與MD5加密算法的基本方法,安全哈希算法第一版和消息摘要算法第五版也是通常人們最常用的加密算法,需要的朋友可以參考下

SHA1

?
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package com.stone.security;
 
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.DigestInputStream;
import java.security.DigestOutputStream;
import java.security.MessageDigest;
import java.util.Arrays;
 
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
 
public class SHA {
 
 
 public static void main(String[] args) throws Exception {
 encodeByMAC("中國oP……&*()…&802134…");
  
 encodeBySHA("中國oP……&*()…&802134…");
  
 shaFile();
 }
 
 /**
 * 使用MAC 算法的 消息摘要
 * @param data
 * @throws Exception
 */
 public static void encodeByMAC(String data) throws Exception{
// KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA1");
// SecretKey key = keyGen.generateKey(); //這個(gè)每次生成的key不一樣, 此處不能使用
  
 PBEKeySpec keySpec = new PBEKeySpec("randomkey^(^&*^%$".toCharArray());
 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
 SecretKey key = keyFactory.generateSecret(keySpec);
  
 /*
  * 此類提供“消息驗(yàn)證碼”(Message Authentication Code,MAC)算法的功能。
  * MAC 基于秘密密鑰提供一種方式來檢查在不可靠介質(zhì)上進(jìn)行傳輸或存儲(chǔ)的信息的完整性。
  * 通常,消息驗(yàn)證碼在共享秘密密鑰的兩個(gè)參與者之間使用,以驗(yàn)證這兩者之間傳輸?shù)男畔ⅰ?
  * 基于加密哈希函數(shù)的 MAC 機(jī)制也叫作 HMAC。結(jié)合秘密共享密鑰,
  * HMAC 可以用于任何加密哈希函數(shù)(如 MD5 或 SHA-1)
  */
 Mac mac = Mac.getInstance("HmacSHA1");
 //以下三種都可用
// Mac mac = Mac.getInstance("HmacSHA256");
// Mac mac = Mac.getInstance("HmacSHA384");
// Mac mac = Mac.getInstance("HmacSHA512");
 mac.init(key);
 byte[] dest = mac.doFinal(data.getBytes());
 System.out.println(dest.length);
 System.out.println("MAC摘要:" + Arrays.toString(dest));
 }
 
 /**
 * SHA1加密 使用消息摘要MessageDigest 處理
 * @throws Exception
 */
 public static String encodeBySHA(String str) throws Exception{
 MessageDigest sha1;
 sha1 = MessageDigest.getInstance("SHA1");
 //以下三種不可用
// sha1 = MessageDigest.getInstance("SHA256");
// sha1 = MessageDigest.getInstance("SHA384");
// sha1 = MessageDigest.getInstance("SHA512");
  
 sha1.update(str.getBytes()); //先更新摘要
 byte[] digest = sha1.digest(); //再通過執(zhí)行諸如填充之類的最終操作完成哈希計(jì)算。在調(diào)用此方法之后,摘要被重置。
  
 /*
  * 使用指定的 byte 數(shù)組對(duì)摘要進(jìn)行最后更新,然后完成摘要計(jì)算。
  * 也就是說,此方法首先調(diào)用 update(input),
  * 向 update 方法傳遞 input 數(shù)組,然后調(diào)用 digest()。
  */
// byte[] digest = sha1.digest(str.getBytes());
  
 String hex = toHex(digest);
 System.out.println("SHA1摘要:" + hex);
 return hex;
 }
 
 /**
 * 文件數(shù)據(jù)摘要
 * @throws Exception
 */
 public static void shaFile() throws Exception {
 MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
 DigestOutputStream dos = new DigestOutputStream(new FileOutputStream(new File("abc.txt")), messageDigest);
 dos.write("中華人民……&())f*(214)admin*".getBytes());
 dos.close();
 byte[] digest = messageDigest.digest();
 System.out.println("使用流寫文件,該文件的摘要為:" + toHex(digest));
  
 DigestInputStream dis = new DigestInputStream(new FileInputStream(new File("abc.txt")), messageDigest);
 byte[] buf = new byte[100];
 int len;
 while ((len = dis.read(buf)) != -1) {
  System.out.println("讀取到的數(shù)據(jù)為:" + new String(buf, 0, len));
 }
 dis.close();
 byte[] digest2 = messageDigest.digest();
 //當(dāng)流讀取完畢,即將文件讀完了, 這時(shí)的摘要 才與 寫入時(shí)的 一樣
 System.out.println("使用流讀文件,該文件的摘要為:" + toHex(digest2));
 }
 
 /**
 * sha1 摘要轉(zhuǎn)16進(jìn)制
 * @param digest
 * @return
 */
 private static String toHex(byte[] digest) {
 StringBuilder sb = new StringBuilder();
 int len = digest.length;
  
 String out = null;
 for (int i = 0; i < len; i++) {
//  out = Integer.toHexString(0xFF & digest[i] + 0xABCDEF); //加任意 salt
  out = Integer.toHexString(0xFF & digest[i]);//原始方法
  if (out.length() == 1) {
  sb.append("0");//如果為1位 前面補(bǔ)個(gè)0
  }
  sb.append(out);
 }
 return sb.toString();
 }
 
}


MD5

MD5(Message Digest Algorithm 5),即消息摘要算法第五版。消息摘要是一種算法:無論原始數(shù)據(jù)多長(zhǎng),消息摘要的結(jié)果都是固定長(zhǎng)度的;是一種不可逆的算法
原始數(shù)據(jù)任意bit位的變化,都會(huì)導(dǎo)致消息摘要的結(jié)果有很大的不同,且根據(jù)結(jié)果推算出原始數(shù)據(jù)的概率極低。
消息摘要可以看作原始數(shù)據(jù)的指紋,指紋不同則原始數(shù)據(jù)不同。

?
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package com.stone.security;
 
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.DigestInputStream;
import java.security.DigestOutputStream;
import java.security.MessageDigest;
import java.util.Arrays;
 
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
 
public class MD5 {
 
 
 public static void main(String[] args) throws Exception {
 encodeByMAC("中國oP……&*()…&802134…");
  
 encodeByMd5("中國oP……&*()…&802134…");
  
 md5File();
 }
 
 /**
 * 使用MAC 算法的 消息摘要
 * @param data
 * @throws Exception
 */
 public static void encodeByMAC(String data) throws Exception{
// KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
// SecretKey key = keyGen.generateKey(); //這個(gè)每次生成的key不一樣, 此處不能使用
  
 PBEKeySpec keySpec = new PBEKeySpec("randomkey^(^&*^%$".toCharArray());
 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
 SecretKey key = keyFactory.generateSecret(keySpec);
  
 /*
  * 此類提供“消息驗(yàn)證碼”(Message Authentication Code,MAC)算法的功能。
  * MAC 基于秘密密鑰提供一種方式來檢查在不可靠介質(zhì)上進(jìn)行傳輸或存儲(chǔ)的信息的完整性。
  * 通常,消息驗(yàn)證碼在共享秘密密鑰的兩個(gè)參與者之間使用,以驗(yàn)證這兩者之間傳輸?shù)男畔ⅰ?
  * 基于加密哈希函數(shù)的 MAC 機(jī)制也叫作 HMAC。結(jié)合秘密共享密鑰,
  * HMAC 可以用于任何加密哈希函數(shù)(如 MD5 或 SHA-1)
  */
 Mac mac = Mac.getInstance("HmacMD5");
 mac.init(key);
 byte[] dest = mac.doFinal(data.getBytes());
 System.out.println(dest.length);
 System.out.println("MAC摘要:" + Arrays.toString(dest));
 }
 
 /**
 * md5加密 使用消息摘要MessageDigest 處理
 * @throws Exception
 */
 public static String encodeByMd5(String str) throws Exception{
 MessageDigest md5;
 md5 = MessageDigest.getInstance("MD5");
  
 md5.update(str.getBytes()); //先更新摘要
 byte[] digest = md5.digest(); //再通過執(zhí)行諸如填充之類的最終操作完成哈希計(jì)算。在調(diào)用此方法之后,摘要被重置。
  
 /*
  * 使用指定的 byte 數(shù)組對(duì)摘要進(jìn)行最后更新,然后完成摘要計(jì)算。
  * 也就是說,此方法首先調(diào)用 update(input),
  * 向 update 方法傳遞 input 數(shù)組,然后調(diào)用 digest()。
  */
// byte[] digest = md5.digest(str.getBytes());
  
 String hex = toHex(digest);
 System.out.println("MD5摘要:" + hex);
 return hex;
 }
 
 /**
 * 文件數(shù)據(jù)摘要
 * @throws Exception
 */
 public static void md5File() throws Exception {
 MessageDigest messageDigest = MessageDigest.getInstance("MD5");
 DigestOutputStream dos = new DigestOutputStream(new FileOutputStream(new File("abc.txt")), messageDigest);
 dos.write("中華人民……&())f*(214)admin*".getBytes());
 dos.close();
 byte[] digest = messageDigest.digest();
 System.out.println("使用流寫文件,該文件的摘要為:" + toHex(digest));
  
  
 DigestInputStream dis = new DigestInputStream(new FileInputStream(new File("abc.txt")), messageDigest);
 byte[] buf = new byte[100];
 int len;
 while ((len = dis.read(buf)) != -1) {
  System.out.println("讀取到的數(shù)據(jù)為:" + new String(buf, 0, len));
 }
 dis.close();
 byte[] digest2 = messageDigest.digest();
 //當(dāng)流讀取完畢,即將文件讀完了, 這時(shí)的摘要 才與 寫入時(shí)的 一樣
 System.out.println("使用流讀文件,該文件的摘要為:" + toHex(digest2));
 }
 
 /**
 * md5 摘要轉(zhuǎn)16進(jìn)制
 * @param digest
 * @return
 */
 private static String toHex(byte[] digest) {
 StringBuilder sb = new StringBuilder();
 int len = digest.length;
  
 String out = null;
 for (int i = 0; i < len; i++) {
//  out = Integer.toHexString(0xFF & digest[i] + 0xABCDEF); //加任意 salt
  out = Integer.toHexString(0xFF & digest[i]);//原始方法
  if (out.length() == 1) {
  sb.append("0");//如果為1位 前面補(bǔ)個(gè)0
  }
  sb.append(out);
 }
 return sb.toString();
 }
 
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2015小明台湾永久区域免费 | 欧美一区二区日韩一区二区 | 五月最新商场女厕所高跟嘘嘘 | 国产短视频精品一区二区三区 | 激情涩涩| 亚洲精品tv久久久久久久久久 | 四虎影院网站 | 国产情侣视频观看 | caoporm碰最新免费公开视频 | 国产午夜精品不卡视频 | 日本中文字幕在线观看视频 | 欧美亚洲国产另类在线观看 | 日本aaaaa高清免费看 | 扒开腚眼子视频大全 | 视频大全在线观看网址 | 国产在线成人a | 国产精品亚洲一区二区久久 | 精品区卡一卡2卡三免费 | 国产精品日韩欧美在线 | 性一交一乱一伧老太 | 日韩有码 | 日本成熟bbxxxxxxxx | 国产一区二区视频在线 | 草莓在线 | 奇米777四色精品综合影院 | 国产成人亚洲精品乱码在线观看 | 精品人人视屏 | 日本精品中文字幕在线播放 | 国产成人综合亚洲一区 | 好吊操这里有精品 | 欧美精品一区二区三区免费观看 | 91在线永久| 亚洲成人国产 | 99精品国产自产在线观看 | 我与么公激情性完整视频 | 校园全黄h全肉细节文 | www视频免费看 | 四虎影视4hu最新地址在线884 | 久久99视热频国只有精品 | 免费看一区二区三区 | 久久精品中文騷妇女内射 |