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
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.Security的getProviders() 方法获得已注册的提供者列表
- 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; } }
派优网部分新闻资讯、展示的图片素材等内容均为用户自发上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习交流。用户通过本站上传、发布任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请
联系我们一经核实,立即删除。并对发布账号进行封禁。
相关推荐
-
很多上班族每天都在使用美团点外卖,你知道美团现在推出了一款类似花呗的产品吗?可以在美团消费的时候先消费后还款,叫做美团月付,是美团推出的一款消费型产品,不能直接提现到银行卡,只能用…
-
在大家的印象中似乎手机都是在不断贬值,随着发布时间越长手机贬值就越严重,就算苹果手机保值率较高,但是也依旧逃离不了贬值的发生。不过却有这样一款手机,不仅没有贬值,反而随着时间的发布…
-
随着高中毕业生人数的增加,越来越多的学生选择进入专科学校继续深造。但是,面对众多的专科学校,学生们该如何选择适合自己的专科学校呢?下面从多个方面为大家介绍如何选择适合自己的专科学校…
-
烧麦 烧麦因其形如一颗大麦而刚出锅的烧麦能烫嘴暖心而得名,面皮透明如雪,包进上等龙口粉丝、瘦肉,吃过来爽口润滑,沙县烧麦的味美还得益于豆豉油。 门店推荐:阿狗烧麦 佳兰烧麦 锅贴 …
-
大家都知道今年是电商行业竞争最激烈的一年。很多实体店因为***倒闭,很多商家从线下转到线上。天猫作为平台的“领头羊”,受到很多商家的青睐,通过Tmall.com转移平台,更容易打开…
-
眼泪是人体分泌的一种液体,它对我们的眼睛有很重要的保护作用。但是,当我们的眼睛过于频繁地流泪时,就会让我们感到非常不舒服。这种情况被称为“淚气重”,它可能是由多种因素引起的。在本文…
-
我视频的背景音乐,一般是通过什么途径,什么方法去寻找收集的呢? 下面就分享给大家。 小花一般就是两个途径,第一个就是剪映自带的音乐库。但是,大部分还是来自于抖音。 今天就具体详细地…
-
随着生活水平的提高,人们对于用水的需求也越来越大。用水的费用也成为了家庭生活的一项重要开支。而在购买水的时候,五块钱一吨的价格是比较常见的。那么,五块钱一吨水一个月大概要用多少钱呢…
-
这两个月想要换机的小伙伴可能大概听说了,华为手机在未来可能不会降价还会涨价,就冲着这保值性也得参考参考。当然,参考可以,如果真的换机,还是有需要注意的地方:华为发布的产品众多,也不…
-
在运营拼多多网店的时候,很多商家都会选择使用多多进宝来进行推广,从而让网店获得更多流量进店转化。而在使用多多进宝的时候,我们知道可以在其中设置相应的优惠券,那么多多进宝中的优惠券设…