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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 加密
, md5
sha1
md5与sha1算法、md5 sha1属于什么算法、swift md5 sha1加密、sha1加密和md5、sha1加密算法,以便于您获取更多的相关知识。

时间: 2024-12-03 06:59:43

详解Java中实现SHA1与MD5加密算法的基本方法_java的相关文章

详解java中finalize的实现与相应的执行过程_java

FinalReference引用 此类是一个package类型,表示它并不是公开的一部分,继承自Reference, 即表示也是一种特定的引用类型,因此每个包装在其中的对象在被回收之前,自己都会放到指定的referqyebceQueue当中. 这个引用对象专门为带finalize方法的类服务,可以理解为每一个有相应的方法的对象,其都会封装为一种finalRefernece对象. 因为finalize方法是object定义的,其默认实现为空.那么如果重写了此方法,那么方法体肯定不为空.即可以通过这

详解java中Reference的实现与相应的执行过程_java

一.Reference类型(除强引用) 可以理解为Reference的直接子类都是由jvm定制化处理的,因此在代码中直接继承于Reference类型没有任何作用.只能继承于它的子类,相应的子类类型包括以下几种.(忽略没有在java中使用的,如jnireference)      SoftReference      WeakReference      FinalReference      PhantomReference 上面的引用类型在相应的javadoc中也有提及.FinalRefere

详解Java中ByteArray字节数组的输入输出流的用法_java

ByteArrayInputStream 介绍ByteArrayInputStream 是字节数组输入流.它继承于InputStream. 它包含一个内部缓冲区,该缓冲区包含从流中读取的字节:通俗点说,它的内部缓冲区就是一个字节数组,而ByteArrayInputStream本质就是通过字节数组来实现的. 我们都知道,InputStream通过read()向外提供接口,供它们来读取字节数据:而ByteArrayInputStream 的内部额外的定义了一个计数器,它被用来跟踪 read() 方法

详解Java中synchronized关键字的死锁和内存占用问题_java

先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以

详解Java中的正则表达式

详解Java中的正则表达式,并列出常用的正则表达式语法和一些常用的场景. 判断一个字符串是否是由数字组成: 当不使用正则表达式的时候的实现代码: public class RegexDemo01 { public static void main(String[] args) { String s = "23432324"; char c[] = s.toCharArray();//将字符串转换成字符数组 for (int i = 0; i < c.length; i++) {

详解Java中的指针、引用及对象的clone

对象|详解 Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它们的区别.优点及缺点.看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的

详解Java的堆内存与栈内存的存储机制_java

堆与内存优化    今天测了一个项目的数据自动整理功能,对数据库中几万条记录及图片进行整理操作,运行接近到最后,爆出了java.lang.outOfMemoryError,java heap space方面的错误,以前写程序很少遇到这种内存上的错误,因为java有垃圾回收器机制,就一直没太关注.今天上网找了点资料,在此基础上做了个整理.  一.堆和栈     堆-用new建立,垃圾回收器负责回收          1.程序开始运行时,JVM从OS获取一些内存,部分是堆内存.堆内存通常在存储地址的

java中javamail发送带附件的邮件实现方法_java

本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

java中double类型运算结果异常的解决方法_java

问题: 对两个double类型的值进行运算,有时会出现结果值异常的问题.比如: System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100); 输出: 39.989999999999995 0.33999999999999997 3.3000000000000003 0.12300000000000001 解决方法: J