詳解Java中實(shí)現(xiàn)SHA1與MD5加密算法的基本方法
SHA1
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ù)多長,消息摘要的結(jié)果都是固定長度的;是一種不可逆的算法
原始數(shù)據(jù)任意bit位的變化,都會(huì)導(dǎo)致消息摘要的結(jié)果有很大的不同,且根據(jù)結(jié)果推算出原始數(shù)據(jù)的概率極低。
消息摘要可以看作原始數(shù)據(jù)的指紋,指紋不同則原始數(shù)據(jù)不同。
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();
}
}
PS:這里再為大家提供2款MD5加密工具,感興趣的朋友可以參考一下:
MD5在線加密工具:
http://tools.jb51.net/password/CreateMD5Password
在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
相關(guān)文章
spring cloud 之 Feign 使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猻pring cloud 之 Feign 使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
IDEA生成可運(yùn)行jar包(包含第三方j(luò)ar包)流程詳解
這篇文章主要介紹了IDEA生成可運(yùn)行jar包(包含第三方j(luò)ar包)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
springboot整合httpClient代碼實(shí)例
這篇文章主要介紹了springboot整合httpClient代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
springSecurity之AuthenticationProvider用法解析
這篇文章主要介紹了springSecurity之AuthenticationProvider用法解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
解決CentOS7中運(yùn)行jar包報(bào)錯(cuò):xxx(Permission?denied)
在實(shí)際工作我們經(jīng)常會(huì)在linux上運(yùn)行Spring boot編寫的微服務(wù)程序,下面這篇文章主要給大家介紹了關(guān)于如何解決CentOS7中運(yùn)行jar包報(bào)錯(cuò):xxx(Permission?denied)的相關(guān)資料,需要的朋友可以參考下2024-02-02
idea運(yùn)行tomcat報(bào)錯(cuò)找不到catalina.bat,系統(tǒng)找不到指定的文件問題
這篇文章主要介紹了idea運(yùn)行tomcat報(bào)錯(cuò)找不到catalina.bat,系統(tǒng)找不到指定的文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,2023-11-11

