国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

詳解Java中實現SHA1與MD5加密算法的基本方法

2019-11-26 14:27:52
字體:
來源:轉載
供稿:網友

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(); //這個每次生成的key不一樣, 此處不能使用    PBEKeySpec keySpec = new PBEKeySpec("randomkey^(^&*^%$".toCharArray());  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");  SecretKey key = keyFactory.generateSecret(keySpec);    /*   * 此類提供“消息驗證碼”(Message Authentication Code,MAC)算法的功能。   * MAC 基于秘密密鑰提供一種方式來檢查在不可靠介質上進行傳輸或存儲的信息的完整性。   * 通常,消息驗證碼在共享秘密密鑰的兩個參與者之間使用,以驗證這兩者之間傳輸的信息。   * 基于加密哈希函數的 MAC 機制也叫作 HMAC。結合秘密共享密鑰,   * HMAC 可以用于任何加密哈希函數(如 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(); //再通過執行諸如填充之類的最終操作完成哈希計算。在調用此方法之后,摘要被重置。    /*   * 使用指定的 byte 數組對摘要進行最后更新,然后完成摘要計算。   * 也就是說,此方法首先調用 update(input),   * 向 update 方法傳遞 input 數組,然后調用 digest()。   */ // byte[] digest = sha1.digest(str.getBytes());    String hex = toHex(digest);  System.out.println("SHA1摘要:" + hex);  return hex;  }   /**  * 文件數據摘要  * @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("讀取到的數據為:" + new String(buf, 0, len));  }  dis.close();  byte[] digest2 = messageDigest.digest();  //當流讀取完畢,即將文件讀完了, 這時的摘要 才與 寫入時的 一樣  System.out.println("使用流讀文件,該文件的摘要為:" + toHex(digest2));  }   /**  * sha1 摘要轉16進制  * @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位 前面補個0   }   sb.append(out);  }  return sb.toString();  }  } 


MD5

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

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(); //這個每次生成的key不一樣, 此處不能使用    PBEKeySpec keySpec = new PBEKeySpec("randomkey^(^&*^%$".toCharArray());  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");  SecretKey key = keyFactory.generateSecret(keySpec);    /*   * 此類提供“消息驗證碼”(Message Authentication Code,MAC)算法的功能。   * MAC 基于秘密密鑰提供一種方式來檢查在不可靠介質上進行傳輸或存儲的信息的完整性。   * 通常,消息驗證碼在共享秘密密鑰的兩個參與者之間使用,以驗證這兩者之間傳輸的信息。   * 基于加密哈希函數的 MAC 機制也叫作 HMAC。結合秘密共享密鑰,   * HMAC 可以用于任何加密哈希函數(如 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(); //再通過執行諸如填充之類的最終操作完成哈希計算。在調用此方法之后,摘要被重置。    /*   * 使用指定的 byte 數組對摘要進行最后更新,然后完成摘要計算。   * 也就是說,此方法首先調用 update(input),   * 向 update 方法傳遞 input 數組,然后調用 digest()。   */ // byte[] digest = md5.digest(str.getBytes());    String hex = toHex(digest);  System.out.println("MD5摘要:" + hex);  return hex;  }   /**  * 文件數據摘要  * @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("讀取到的數據為:" + new String(buf, 0, len));  }  dis.close();  byte[] digest2 = messageDigest.digest();  //當流讀取完畢,即將文件讀完了, 這時的摘要 才與 寫入時的 一樣  System.out.println("使用流讀文件,該文件的摘要為:" + toHex(digest2));  }   /**  * md5 摘要轉16進制  * @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位 前面補個0   }   sb.append(out);  }  return sb.toString();  }  } 

PS:這里再為大家提供2款MD5加密工具,感興趣的朋友可以參考一下:

MD5在線加密工具:

http://tools.VeVB.COm/password/CreateMD5Password

在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:

http://tools.VeVB.COm/password/hash_md5_sha

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 从江县| 沛县| 仁布县| 永兴县| 中西区| 双辽市| 三都| 景洪市| 乐清市| 乃东县| 沙雅县| 瑞丽市| 古浪县| 安庆市| 无棣县| 昭平县| 开平市| 东乡县| 奉节县| 武陟县| 公安县| 双江| 灵宝市| 新津县| 育儿| 商城县| 皮山县| 东乌珠穆沁旗| 济阳县| 师宗县| 柯坪县| 开平市| 松阳县| 梅河口市| 南召县| 布尔津县| 沙湾县| 新野县| 海南省| 万全县| 平江县|