转自:https://blog.csdn.net/jay314159/article/details/4918358
前言:
MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的算法之一,主流的编程语言均有MD5的实现。
将数据(字符串)运算为另一固定长度值是加密的基本原理,MD5的前身有MD2、MD3、MD4。
本文介绍使用MD5进行加密和验证,将原本的字符串通过MD5加密后成另一个字符串,而且根据新的字符串无法获得原字符串,但可以在不知道原始密码的情况下进行验证。
关键技术:
通过java.security.MessageDigest的静态方法getInstance创建具有指定算法名称的信息摘要,参数为算法名,传入"MD5"则表明要使用MD5算法。
MessageDigest的digest实例方法使用指定的字节数组对摘要进行最后更新,然后完成摘要计算,返回存放哈希值结果的季节数组,这个数组就是MD5加密产品。
将加密后的字节数组转换成十六进制的字符窜,形成最终的密码。
当输入字符串经过MD5加密后,得到的字符串与密码一样,则认为密码验证通过。
实例演示:
package com.zhanzhuang.md5; import java.security.MessageDigest; /** * @author zhan zhuang * @time 2018年6月8日下午1:48:06 * */ public class Encryption { public static void main(String[] args) { String password = Encryption.createPassword("123456"); System.out.println("对123456用MD5加密后的密码为:" + password); String inputstr = "1234"; System.out.println("1234与密码相同?" + Encryption.authenticatePassword(password, inputstr)); inputstr = "123456"; System.out.println("123456与密码相同?" + Encryption.authenticatePassword(password, inputstr)); } // 16进制下数字到字符的映射数组 private static String[] hexDigits = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; // 将inputstr加密的方法 public static String createPassword(String inputstr) { return encodeByMD5(inputstr); } // 验证密码是否正确 public static boolean authenticatePassword(String pass, String inputstr) { if (pass.equals((encodeByMD5(inputstr)))) { return true; } else { return false; } } // 对字符串进行MD5编码 private static String encodeByMD5(String originstr) { if (originstr != null) { try { // 创建具有指定算法名称的信息摘要 MessageDigest md = MessageDigest.getInstance("MD5"); // 使用指定的字节数组对摘要进行最后的更新,然后完成摘要计算 byte[] results = md.digest(originstr.getBytes()); // 将得到的字节数组编程字符串返回 String resultString = byteArrayToHexString(results); return resultString.toUpperCase(); } catch (Exception ex) { ex.printStackTrace(); } } return null; } // 转换字节数组为十六进制字符串 private static String byteArrayToHexString(byte[] b) { StringBuffer resultsb = new StringBuffer(); int i = 0; for (i = 0; i < b.length; i++) { resultsb.append(byteToHexString(b[i])); } return resultsb.toString(); } // 将字节转化成十六进制的字符串 private static String byteToHexString(byte b) { int n = b; if (n < 0) { n = 256 + n; } int d1 = n / 16; int d2 = n / 16; return hexDigits[d1] + hexDigits[d2]; } }