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

 更新时间:2016年04月01日 08:58:12   作者:匆忙拥挤repeat  
这篇文章主要介绍了详解Java中实现SHA1与MD5加密算法的基本方法,安全哈希算法第一版和消息摘要算法第五版也是通常人们最常用的加密算法,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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

相关文章

  • spring cloud Ribbon用法及原理解析

    spring cloud Ribbon用法及原理解析

    这篇文章主要介绍了spring cloud Ribbon用法及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 如何用java给文件加密的简单实现

    如何用java给文件加密的简单实现

    文件加密,简单来说就是把文件读取出来,把读取出来的字节码数组进行遍历,把每一个码值和一个秘钥(随便一个数)进行异或运算,将运算后的结果全部写入到文件里,这篇文章主要介绍了如何用java给文件加密的简单实现,需要的朋友可以参考下
    2023-12-12
  • spring boot整合CAS配置详解

    spring boot整合CAS配置详解

    这篇文章主要介绍了spring boot整合CAS配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • spring cloud 之 Feign 使用HTTP请求远程服务的实现方法

    spring cloud 之 Feign 使用HTTP请求远程服务的实现方法

    下面小编就为大家带来一篇spring cloud 之 Feign 使用HTTP请求远程服务的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Mybatis查询时,区分大小写操作

    Mybatis查询时,区分大小写操作

    这篇文章主要介绍了Mybatis查询时,区分大小写操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • IDEA生成可运行jar包(包含第三方jar包)流程详解

    IDEA生成可运行jar包(包含第三方jar包)流程详解

    这篇文章主要介绍了IDEA生成可运行jar包(包含第三方jar包)流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • springboot整合httpClient代码实例

    springboot整合httpClient代码实例

    这篇文章主要介绍了springboot整合httpClient代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • springSecurity之AuthenticationProvider用法解析

    springSecurity之AuthenticationProvider用法解析

    这篇文章主要介绍了springSecurity之AuthenticationProvider用法解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 解决CentOS7中运行jar包报错:xxx(Permission?denied)

    解决CentOS7中运行jar包报错:xxx(Permission?denied)

    在实际工作我们经常会在linux上运行Spring boot编写的微服务程序,下面这篇文章主要给大家介绍了关于如何解决CentOS7中运行jar包报错:xxx(Permission?denied)的相关资料,需要的朋友可以参考下
    2024-02-02
  • idea运行tomcat报错找不到catalina.bat,系统找不到指定的文件问题

    idea运行tomcat报错找不到catalina.bat,系统找不到指定的文件问题

    这篇文章主要介绍了idea运行tomcat报错找不到catalina.bat,系统找不到指定的文件问题,具有很好的参考价值,希望对大家有所帮助,
    2023-11-11

最新评论


http://www.vxiaotou.com