自己写的MD5加密原码

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
		//从这里看出   值不是随意生成的,给定更新数据,则每次生成的值都一样
	}

}

  

posted @ 2017-07-05 16:18  奋斗的少年WH  阅读(373)  评论(0编辑  收藏  举报