当前位置: 首页 > 编程笔记 >

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

尉迟墨竹
2023-03-14
本文向大家介绍详解Java中实现SHA1与MD5加密算法的基本方法,包括了详解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(); 
 } 
 
 /** 
 * 使用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.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

 类似资料:
  • 本文向大家介绍JS实现的base64加密、md5加密及sha1加密详解,包括了JS实现的base64加密、md5加密及sha1加密详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现的base64加密、md5加密及sha1加密。分享给大家供大家参考,具体如下: 1、base64加密 在页面中引入base64.js文件,调用方法为: 2、md5加密 在页面中引用md5.js文件,调用

  • 本文向大家介绍java基于Des对称加密算法实现的加密与解密功能详解,包括了java基于Des对称加密算法实现的加密与解密功能详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java基于Des对称加密算法实现的加密与解密功能。分享给大家供大家参考,具体如下: Des 加密相关类介绍: SecureRandom  这个类是继承自java.util.Random 这个类 SecureRan

  • 本文向大家介绍JavaScript SHA1加密算法实现详细代码,包括了JavaScript SHA1加密算法实现详细代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家介绍了JavaScript SHA1加密算法吗,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家有所帮助,希望大家继续关注呐喊教程的最新内容。

  • 本文向大家介绍java中加密的实现方法(MD5,MD2,SHA),包括了java中加密的实现方法(MD5,MD2,SHA)的使用技巧和注意事项,需要的朋友参考一下 java中加密的实现方法(MD5,MD2,SHA)      实例代码:注释都很清楚, 输出结果:  以上就是java 加密的实例,如疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 本文向大家介绍java实现MD5加密的方法小结,包括了java实现MD5加密的方法小结的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现MD5加密的方法。分享给大家供大家参考,具体如下: 方法二 PS:关于加密解密感兴趣的朋友还可以参考本站在线工具: 文字在线加密解密工具(包含AES、DES、RC4等): http://tools.jb51.net/password/txt_en

  • 本文向大家介绍php结合md5实现的加密解密方法,包括了php结合md5实现的加密解密方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php结合md5实现的加密解密方法。分享给大家供大家参考,具体如下: 最近在整理代码发现了一个不错的东西,结合md5的加解密算法。网上关于php结合md5的加密,解密算法比较少的,其实php手册里面就有,改一改就行了。在此贴一下,用这算法要加载一个php