最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年04月01日 08:58:12   作者:匆忙擁擠repeat  
這篇文章主要介紹了詳解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("中國(guó)oP……&*()…&802134…"); 
  
 encodeBySHA("中國(guó)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ù)不同。

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("中國(guó)oP……&*()…&802134…"); 
  
 encodeByMd5("中國(guó)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加密工具:

http://tools.jb51.net/password/hash_md5_sha

相關(guān)文章

  • Java實(shí)現(xiàn)二叉堆、大頂堆和小頂堆

    Java實(shí)現(xiàn)二叉堆、大頂堆和小頂堆

    二叉堆就是完全二叉樹,或者是靠近完全二叉樹結(jié)構(gòu)的二叉樹。大頂堆要求對(duì)于一個(gè)節(jié)點(diǎn)來說,它的左右節(jié)點(diǎn)都比它??;小頂堆要求對(duì)于一個(gè)節(jié)點(diǎn)來說,它的左右節(jié)點(diǎn)都比它大。本文將用Java分別實(shí)現(xiàn)二叉堆、大頂堆和小頂堆。需要的可以參考一下
    2022-01-01
  • java實(shí)現(xiàn)輸入輸出流代碼分享

    java實(shí)現(xiàn)輸入輸出流代碼分享

    這篇文章主要介紹了java實(shí)現(xiàn)輸入輸出流代碼分享的相關(guān)資料,需要的朋友可以參考下
    2015-09-09
  • Java經(jīng)典面試題最全匯總208道(二)

    Java經(jīng)典面試題最全匯總208道(二)

    這篇文章主要介紹了Java經(jīng)典面試題最全匯總208道(二),本文章內(nèi)容詳細(xì),該模塊分為了六個(gè)部分,本次為第二部分,需要的朋友可以參考下<BR>
    2023-01-01
  • JAVA利用接口實(shí)現(xiàn)多繼承問題的代碼實(shí)操演示

    JAVA利用接口實(shí)現(xiàn)多繼承問題的代碼實(shí)操演示

    Java語言并不支持多繼承,這是由于多繼承會(huì)帶來許多復(fù)雜的問題,例如"菱形問題"等,下面這篇文章主要給大家介紹了關(guān)于JAVA利用接口實(shí)現(xiàn)多繼承問題的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • java日期處理工具類

    java日期處理工具類

    這篇文章主要為大家詳細(xì)介紹了java日期處理工具類,其次還介紹了日期處理的基礎(chǔ)知識(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時(shí),每天)

    Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時(shí),每天)

    SpringCloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了Spring Cloud Gateway不同頻率限流(每分鐘,每小時(shí),每天),需要的朋友可以參考下
    2020-10-10
  • Java如何使用命令查看內(nèi)存占用情況

    Java如何使用命令查看內(nèi)存占用情況

    jhat是一個(gè)用于分析Java堆轉(zhuǎn)儲(chǔ)文件的工具,通過啟動(dòng)Web服務(wù)器并加載堆轉(zhuǎn)儲(chǔ)文件,可以在瀏覽器中查看占用最多內(nèi)存的類及其詳細(xì)信息
    2025-02-02
  • java多線程編程同步器Future和FutureTask解析及代碼示例

    java多線程編程同步器Future和FutureTask解析及代碼示例

    這篇文章主要介紹了java多線程編程同步器Future和FutureTask解析及代碼示例,對(duì)二者進(jìn)行了詳細(xì)介紹,分析了future的源碼,最后展示了相關(guān)實(shí)例代碼,具有一定參考價(jià)值 ,需要的朋友可以了解下。
    2017-11-11
  • Spring Boot中使用Spring-data-jpa實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪查改

    Spring Boot中使用Spring-data-jpa實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪查改

    本篇文章主要介紹了Spring Boot中使用Spring-data-jpa實(shí)現(xiàn)增刪查改,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-03-03
  • IDEA 格式化SQL代碼技巧分享

    IDEA 格式化SQL代碼技巧分享

    這篇文章主要介紹了IDEA 格式化SQL代碼技巧分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評(píng)論

南昌县| 介休市| 科技| 咸丰县| 台安县| 阳原县| 乌兰浩特市| 夏邑县| 桦甸市| 松原市| 浏阳市| 青龙| 当雄县| 山阴县| 曲麻莱县| 凤城市| 龙南县| 塔河县| 通江县| 原阳县| 山阳县| 绥中县| 宁海县| 叙永县| 海丰县| 曲水县| 横山县| 库伦旗| 连城县| 蓬莱市| 通渭县| 库尔勒市| 团风县| 阜南县| 雷山县| 东方市| 普定县| 泗阳县| 息烽县| 古蔺县| 根河市|