package com.wh.md5; import java.security.MessageDigest; import java.util.Arrays; /** * @author 王恒 * @datetime 2017年7月5日 下午3:40:58 * @description * MD5加密源码 * 核心是21行到26行及36、37行(好吧,位运算在这里真的挺有用) * @see 常用于对登录密码进行加密,能保证,即使数据库被侵占了,对方也拿不到明文密码 */ public class MyMd5 { public final static String md5(String s){ //以16进制进行转换 char[] hexDigits={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; try{ //将字符创变为字节数组 byte[] strTemp = s.getBytes(); //创建MessageDigest对象 MessageDigest mdTemp = MessageDigest.getInstance("MD5"); //使用strTemp字节数组更新mdTemp摘要 mdTemp.update(strTemp); //通过填充之类的相关操作完成哈希计算 byte[] digest = mdTemp.digest(); System.out.println("byte[] digest: "+Arrays.toString(digest)); // 得到哈希算法之后的长度 int j=digest.length; //System.out.println("digest.length: "+j); //创建一个新的字符数组,长度为digest的两倍,用于创建新的字符创 char[] newChar=new char[2*j]; int k=0; for(int i=0;i<j;i++){ byte b=digest[i]; newChar[k++]=hexDigits[b>>>4&0xf];//奇数位的位运算 newChar[k++]=hexDigits[b&0xf];//偶数位的位运算 } //返回一个新的字符串 return new String(newChar); }catch(Exception e){ return null; } } public static void main(String[] args) { String md5 = MyMd5.md5("b"); System.out.println("md5: "+md5); //第1次输出值 md5: 92eb5ffee6ae2fec3ad71c777531578f //第2次输出值 md5: 92eb5ffee6ae2fec3ad71c777531578f //从这里看出 值不是随意生成的,给定更新数据,则每次生成的值都一样 } }