数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数。数字摘要就是采用单向Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。 -----百度百科
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
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
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
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) 两个散列值不同,则对应的原始的输入的数据也不同