ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

加密算法原理解析!详细分析MD5实现系统加密及使用实践

2022-01-19 22:01:46  阅读:184  来源: 互联网

标签:MessageDigest return String reStr 详细分析 byte 加密算法 MD5


MD5加密算法的实现原理

  • Java中MD5加密算法的实现:
public class MD5 {
	// 全局数组
	private final static String[] strDigit = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

	public class MD5 {
	}

	// 返回形式为数字和字符串
	private static String byteToArrayString(byte bByte) {
		int iRet = bByte;
		if (iRet < 0) {
			iRet += 256;
		}
		int iD1 = iRet / 16;
		int iD2 = iRet % 16;
		return strDigits[iD1] + strDigits[iD2];
	}	

	// 返回形式只为数字
	private static String byteToNum(byte bByte) {
		int iRet = bByte;
		if (iRet < 0) {
			iRet += 256;
		}
		return String.valueOf(iRet);
	}

	// 将字节数组转换成为16进制的字符串
	private static String byteToString(byte[] bByte) {
		StringBuffer stringBuffer = new StringBuffer();
		for (int i; i < bByte.length; i++) {
			StringBuffer.append(byteToArrayString(bByte[i]));
		}
		return stringBuffer.toString();
	}

	// 获取MD5值
	public static String GetMD5Code(String strObj) {
		String resultString = null;
		try {
			resultString = new String();
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			// md5.digest() - 返回值为存放Hash值结果的byte数组
			resultString = byteToString(md5.digest(strObj.getBytes()));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return resultString;
	}
} 

MessageDigest类

  • MessageDigest类:
    • 为应用程序提供信息摘要算法的功能.比如MD5算法和SHA算法
    • 信息摘要是安全的单向Hash函数 : 接收任意大小的数据,并输出固定长度的Hash值

update

  • MessageDigest对象在开始时会被初始化
  • 对象通过调用update() 方法处理数据
/**
 * 使用指定的byte数组更新摘要
 *
 * @param input 指定的byte数组
 */
public void update(byte[] input);

reset

  • 任何时候都可以调用reset() 方法重置摘要

digest

  • 一旦所需要更新的数据都已经被更新后,应该调用digest() 方法完成Hash计算
  • 对于给定数量的更新数据 ,digest() 方法只能被调用一次.在调用digest() 方法之后,MessageDigest对象被重新设置成初始状态
/**
 * 通过执行诸如填充之类的最终操作完成Hash计算. 
 * 在调用此方法之后,摘要被重置
 *
 * @return byte[] Hash计算后的byte数组
 */
public byte[] digest();

isEqual

/**
 * 比较两个摘要的相等性.做简单的字节比较
 *
 * @param digestA 比较的摘要字节数组A
 * @param digestB 比较的摘要字节数组B
 * @return boolean 是否相等
 */
public static boolean isEqual(byte[] digestA, byte[] digestB);

getInstance

  • 返回实现指定摘要算法的MessageDigest对象
/**
 * 返回实现指定摘要算法的MessageDigest对象
 *
 * @param algorithm 请求的算法的名称
 * @param provider 提供者名称
 * @return MessageDigest 指定摘要算法的MessageDigest对象
 * @throws NoSuchAlgorithmException 当指定的请求算法名称不存在时抛出异常
 */
public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException; 

/**
 * 返回实现指定摘要算法的MessageDigest对象
 *
 * @param algorithm 请求算法的名称
 * @return MessageDigest 指定摘要算法的MessageDigest对象
 * @throws NoSuchAlgorithmException 当指定的请求算法名称不存在时抛出异常
 */
public static MessageDigest getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException;
  • Provider可以通过java.security.SecuritygetProviders() 方法获得已注册的提供者列表
  • SUN提供的常用的算法:
    • MD2
    • MD5
    • SHA-1
    • SHA-256
    • SHA-384
    • SHA-512

字符串的MD5加密算法

  • 使用Java自带的MessageDigest实现对文本的MD5加密算法:
/**
 * 将字符串转换为MD5
 */
 public class ParseMD5 {
 	public static String parseStrToMd5L32(String str) {
 		// 将字符串转换为32位小写MD5 
 		String reStr = null;
 		try {
 			MessageDigest md5 = MessageDigest.getInstance("MD5");
 			byte[] bytes = md5.digest(str.getBytes());
 			StringBuffer stringBuffer = new StringBuffer();
 			for (byte b : bytes) {
 				int bt = b&0xff;
 				if (bt < 16) {
 					stringBuffer.append(0);
 				}
 				stringBuffer.append(Integer.toHexString(bt));
 			}
 			reStr = stringBuffer.toString();
 		} catch (NoSuchAlgorithmException e) {
 			e.printStackTrace();
 		}
 		return reStr;
 	}

	// 将字符串转换为32位大写的MD5
	public static String parseStrToMd5U32(String str) {
		String reStr = parseStrToMd5L32(str);
		if (reStr != null) {
			reStr = reStr.toUpperCase();
		}
		return resStr;
	}

	// 将字符串转换为16位小写的MD5
	public static String parseStrToMd5L16(String str) {
		String reStr = paseStrToMd5L32(str);
		if (reStr != null) {
			reStr = reStr.subString(8, 24);
		}
		return reStr;
	}

	// 将字符串转换为16位大写的MD5
	public static String parseStrToMd5U16(String str) {
		String reStr = parseStrToMd5L32(str);
		if (reStr != null) {
			reStr = reStr.toUpperCase().subString(8, 24);
		}
		return reStr;
	}
 }

文本的MD5加密工具类

  • Java中提供了自带的MessageDigest实现对文本的加密算法. 对文本进行加密的MD5加密工具类如下:
public class MD5Util {
	// 将文本转换为32位小写的MD5
	public static String textToMd5L32(String plainText) {
		String result = null;
		// 判断需要转换的文本是否为空
		if (StringUtils.isBlank(plainText)) {
			return null;
		}
		try {
			// 进行实例化和初始化
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			// 得到一个操作系统默认的字节编码格式的字节数组
			byte[] byteInput = plainText.getBytes();
			// 对得到的字节数组进行处理
			md5.update(byteInput);
			// 进行Hash计算并得到返回结果
			byte[] btResult = md5.digest();
			// 得到进行Hash计算后数据的长度
			StringBuffer stringBuffer = new StringBuffer();
			for (byte b : btResult) {
				int bt = b&0xff;
				if (bt < 16) {
					stringBuffer.append(0);
				}
				stringBuffer.append(Integer.toHexString(bt));
			}
			reStr = stringBuffer.toString();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return reStr;
	}

	// 将文本转换为32位大写的MD5
	public static String textToMd5U32(String plainText) {
		if (StringUtils.isBlank(plainText)) {
			return null;
		}
		String result = textToMd5L32(plainText);
		result = result.toUpperCase();
		return result;
	}	
}

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3jtbg33mo9q8c

标签:MessageDigest,return,String,reStr,详细分析,byte,加密算法,MD5
来源: https://www.cnblogs.com/chova/p/15824298.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有