一、JDK提供的默认MD5算法工具
MD5算法类型枚举
/**
* JDK提供的默认摘要算法.
*
* @author linzp
* @date 2022/2/8 16:46
*/publicenumDigestAlgorithmEnum{/**
* MD5
*/MD5("MD5"),/**
* MD2
*/MD2("MD2"),/**
* SHA
*/SHA("SHA"),/**
* SHA
*/SHA1("SHA-1"),/**
* SHA2
*/SHA224("SHA-224"),/**
* SHA2
*/SHA256("SHA-256"),/**
* SHA5
*/SHA384("SHA-384"),/**
* SHA5
*/SHA512("SHA-512");/**
* 算法编码.
*/privateString code;/**
* 无参
*/DigestAlgorithmEnum(){}/**
* 构造.
* @param code
*/DigestAlgorithmEnum(String code){this.code= code;}publicStringgetCode(){return code;}publicvoidsetCode(String code){this.code= code;}}
MD5算法工具类
importio.sugo.cloud.data.security.enums.DigestAlgorithmEnum;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;/**
* 常规摘要算法:MD5、SHA实现
*
* @author linzp
* @date 2022/2/8 16:44
*/publicfinalclassMD5Util{/**
* 16进制
*/privatestaticfinalString[] HEX_DIGITS={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};/**
* 私有构造
*/privateMD5Util(){}/**
* md5加密
*
* @param srcData
* @return
*/publicstaticStringentrypt(DigestAlgorithmEnum digestAlgorithmEnum,byte[] srcData){byte[] secretBytes=null;try{
secretBytes=MessageDigest.getInstance(digestAlgorithmEnum.getCode()).digest(srcData);}catch(NoSuchAlgorithmException e){thrownewRuntimeException("this digest algorithm is not exists!");}returnbyteToHexString(secretBytes);}/**
* 转换16进制.
*
* @param bs
* @return
*/publicstaticStringbyteToHexString(byte[] bs){StringBuffer sb=newStringBuffer();for(byte b: bs){
sb.append(byteToHexString(b));}return sb.toString();}/**
* 转换16进制.
*
* @param b
* @return
*/privatestaticStringbyteToHexString(byte b){int n= b;if(n<0){
n=256+ n;}int d1= n/16;int d2= n%16;return HEX_DIGITS[d1]+ HEX_DIGITS[d2];}}
二、国密SM3摘要算法实现工具类
需要导入maven依赖
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.69</version></dependency>
国密SM3实现摘要算法加密工具类,可实现对文件的MD5加密
importorg.bouncycastle.crypto.digests.SM3Digest;importorg.bouncycastle.crypto.macs.HMac;importorg.bouncycastle.crypto.params.KeyParameter;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.util.encoders.Hex;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.security.MessageDigest;importjava.security.Security;/**
* 国密SM3摘要算法实现工具.
* 用于替换MD5、SHA算法
*
* @author linzp
* @date 2022/2/8 10:48
*/publicfinalclassSM3Util{/**
* 私有构造器.
*/privateSM3Util(){}// 拓展算法提供方,加载BC库.static{Security.addProvider(newBouncyCastleProvider());}/**
* SM3摘要算法逻辑
*
* @param srcData 待加密byte[]
* @return
*/privatestaticbyte[]sm3(byte[] srcData){SM3Digest sm3Digest=newSM3Digest();
sm3Digest.update(srcData,0, srcData.length);byte[] hash=newbyte[sm3Digest.getDigestSize()];
sm3Digest.doFinal(hash,0);return hash;}/**
* 摘要算法加密
*
* @param srcData 待加密byte[]
* @return
*/publicstaticStringencrypt(byte[] srcData){byte[] hash=sm3(srcData);String hexString=Hex.toHexString(hash);return hexString;}/**
* 指定密钥进行加密.
*
* @param key 密钥
* @param srcData 待加密byte[]
* @return
*/privatestaticbyte[]hmacSm3(byte[] key,byte[] srcData){KeyParameter keyParameter=newKeyParameter(key);SM3Digest digest=newSM3Digest();HMac mac=newHMac(digest);
mac.init(keyParameter);
mac.update(srcData,0, srcData.length);byte[] hash=newbyte[mac.getMacSize()];
mac.doFinal(hash,0);return hash;}/**
* 指定密钥进行加密.
*
* @param key 密钥
* @param srcData 待加密byte[]
* @return
*/publicstaticStringencrypt(byte[] key,byte[] srcData){byte[] hash=hmacSm3(key, srcData);String hexString=Hex.toHexString(hash);return hexString;}/**
* 基于BC库的摘要算法加密
*
* @param srcData 待加密byte[]
* @return
* @throws Exception
*/privatestaticbyte[]sm3bc(byte[] srcData)throwsException{MessageDigest messageDigest=MessageDigest.getInstance("SM3","BC");byte[] digest= messageDigest.digest(srcData);return digest;}/**
* 基于BC库的摘要算法加密
*
* @param srcData 待加密byte[]
* @return
* @throws Exception
*/publicstaticStringencryptBC(byte[] srcData)throwsException{byte[] hash=sm3bc(srcData);String hexString=Hex.toHexString(hash);return hexString;}/**
* 对文件进行摘要算法加密.
*
* @param file
* @return
*/publicstaticStringencrypt(File file){//TODO-linzp 如使用大文件应该对此方法进行优化,避免出现OOMbyte[] srcData;FileInputStream fis=null;ByteArrayOutputStream bos=newByteArrayOutputStream();try{
fis=newFileInputStream(file);byte[] b=newbyte[1024];int n;while((n= fis.read(b))!=-1){
bos.write(b,0, n);}
srcData= bos.toByteArray();}catch(Exception e){
e.printStackTrace();thrownewRuntimeException("file not found!");}finally{closeResoruce(fis, bos);}returnencrypt(srcData);}/**
* 关闭资源.
*
* @param fis
* @param bos
*/privatestaticvoidcloseResoruce(FileInputStream fis,ByteArrayOutputStream bos){if(null!= fis){try{
fis.close();}catch(IOException e){
e.printStackTrace();}}if(null!= bos){try{
bos.close();}catch(IOException e){
e.printStackTrace();}}}}