java--使用MD5和sha简单的 创建消息摘要

一、消息摘要

数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数。数字摘要就是采用单向Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。                      -----百度百科

二、使用MD5对字符串获取MD5

 

package md;
 import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;
/**
 * 
 * @author yangdidi
 * time 20200619
 *
 */
public class Md5Demo {
	public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
	
		//获取到MessageDigest实例
		MessageDigest messageDigest2=MessageDigest.getInstance("MD5");
		String string2="yangdidi";
		//将数据送入到MessageDigest实例
		messageDigest2.update(string2.getBytes());
		//转化
		byte[] resultString2=messageDigest2.digest();
		//输出16进制的字符串
         System.out.println(arr2HexStr(resultString2, true));
		
	}
	 public static String arr2HexStr(byte[] arr,boolean lowerCase){
		        return Hex.encodeHexString(arr, lowerCase);
		   }
	
	

}

输出结果:

0a75a010a7058cde18ead7de166d2ed2

二、使用MD5对文件生成MD5码

package md;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;

public class Md5Demo2 {
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
	 MessageDigest messageDigest=MessageDigest.getInstance("MD5");
	 FileInputStream fileInputStream=new FileInputStream(new File("D:/开源框架/mysql-connector-java-5.1.39-bin.jar"));
	 DigestInputStream digestInputStream=new DigestInputStream(fileInputStream, messageDigest);
	    byte[] databyte=new byte[1024];
	int len =-1;
	while((len=digestInputStream.read(databyte))!=-1)
			{
		      //将数据读出
			}
	MessageDigest messageDigest2=    digestInputStream.getMessageDigest();
	byte[] bs=messageDigest2.digest();
	String cString=  arr2HexStr(bs,true);
	System.out.println(cString);
         
	
	    
}
public static String arr2HexStr(byte[] arr,boolean lowerCase){
    return Hex.encodeHexString(arr, lowerCase);
}

}

实现结果:

7745f482af1f3418b210c158955a1afb

三、利用sha创建数字签名

package md;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;

public class Sha_Demo1 {
	public static void main(String[] args) throws NoSuchAlgorithmException {
		
		//获取到MessageDigest实例
		MessageDigest messageDigest2=MessageDigest.getInstance("SHA-256");
		String string2="yangdidi";
		//将数据送入到MessageDigest实例
		messageDigest2.update(string2.getBytes());
		//转化
		byte[] resultString2=messageDigest2.digest();
		//输出16进制的字符串
         System.out.println(arr2HexStr(resultString2, true));
		
	}
	 public static String arr2HexStr(byte[] arr,boolean lowerCase){
		        return Hex.encodeHexString(arr, lowerCase);
		   }
	
	

}

实现结果:

bc254b8105454fb61996abf7f2d234ac50f818990638dcdc851b8c440edc5544

四、使用HMC进行签名

package md;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Hex;

public class Hmc_Dem01{
	public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException {
		 //初始化keyGenerator
		  KeyGenerator keyGen=KeyGenerator.getInstance("HmacMD5");
		 //产生密钥
		 SecretKey secretKey=keyGen.generateKey();
	
		 //实例化Mac
		Mac mac=Mac.getInstance("HmacMD5");
		//用密钥初始化Mac
		mac.init(secretKey);
		//执行消息摘要
		String cString="yangdidi";
		
		byte[] result=mac.doFinal(cString.getBytes());
		System.out.println(encodeTOhex(result, true));

	}
	public static String encodeTOhex(byte[] c,boolean lowerCase)
	{
		  return Hex.encodeHexString(c, lowerCase);
	}

}

实现结果:

f9b180014ef55d3303ad1610f0ae72e9

总结:

1散列函数的特征

 (1)输入任意长度的数据,输出固定长度的散列值,计算很容易,过程不可逆

 (2) 对于某个数据,其散列值固定

 (3)两个数据不同,则对应的散列值也不同

 (4) 两个散列值不同,则对应的原始的输入的数据也不同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值