栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

详解Java中实现SHA1与MD5加密算法的基本方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解Java中实现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(); 
 } 
 
  
 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); 
  
  
 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)); 
 } 
 
  
 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[] digest = sha1.digest(str.getBytes()); 
  
 String hex = toHex(digest); 
 System.out.println("SHA1摘要:" + hex); 
 return hex; 
 } 
 
  
 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)); 
 } 
 
  
 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(); 
 } 
 
  
 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); 
  
  
 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)); 
 } 
 
  
 public static String encodeByMd5(String str) throws Exception{ 
 MessageDigest md5; 
 md5 = MessageDigest.getInstance("MD5"); 
  
 md5.update(str.getBytes()); //先更新摘要 
 byte[] digest = md5.digest(); //再通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。 
  
  
// byte[] digest = md5.digest(str.getBytes()); 
  
 String hex = toHex(digest); 
 System.out.println("MD5摘要:" + hex); 
 return hex; 
 } 
 
  
 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)); 
 } 
 
  
 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.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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/150363.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号