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];}}
需要导入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();}}}}