首页 > 代码库 > java MD5加密

java MD5加密

今天在写注册登录的时候想起来为密码做一个加密,于是去网上搜索用哪方面的技术,最后确定了java自带的MD5单向加密,这个好处就是加密以后是无法解密的,有利于数据的安全,代码比较少,但是需要认真理解为什么要这样写,我先把代码贴出来。

我是需要把密码加密成一个32位的字符串

public class MD5 {    public static String getHash(String password) throws NoSuchAlgorithmException {        ///获取MD5算法实例 得到一个md5的消息摘要        MessageDigest m = MessageDigest.getInstance("MD5");        //添加要进行计算摘要的信息        m.update(password.getBytes());        //得到该摘要,获得16位字符        byte[]bytes  = m.digest();        StringBuffer sb = new StringBuffer();       for (byte b: bytes){           //一个byte是8位,而一个int是32位,所以不使用0XFF的时候,byte高24位都是随机的           //这样转换的话很容易出错,而使用0xff,他的低8位都是1,高24位都是0,这样就能使byte的高24位都置换位0,而低8位都可以是原来的数         String s = Integer.toHexString(0xff&b);           if (s.length()==1){               //要是32位字符                sb.append("0"+s);           }else{               sb.append(s);           }       }        return sb.toString();    }}

 

首先在以下代码中,我把我的密码加密成了一个16位的字符串

 ///获取MD5算法实例 得到一个md5的消息摘要        MessageDigest m = MessageDigest.getInstance("MD5");        //添加要进行计算摘要的信息        m.update(password.getBytes());        //得到该摘要,获得16位字符        byte[]bytes  = m.digest();

我的需求的32位的,所以继续进行加密,在这里会有比较难以理解的一句

 String s = Integer.toHexString(0xff&b);
 StringBuffer sb = new StringBuffer();       for (byte b: bytes){           //一个byte是8位,而一个int是32位,所以不使用0XFF的时候,byte高24位都是随机的           //这样转换的话很容易出错,而使用0xff,他的低8位都是1,高24位都是0,这样就能使byte的高24位都置换位0,而低8位都可以是原来的数         String s = Integer.toHexString(0xff&b);           if (s.length()==1){               //要是32位字符                sb.append("0"+s);           }else{               sb.append(s);           }       }
我一开始不明白这句话的意思,第一什么是0xff,第二为什么要&b,第三为什么要用int类型进行转换?

首先来分析第一个问题,为什么要用0xff。0xff表示十进制的255,换成二进制就是低八位都是1,其他24位都是0。

第二个问题是我为什么要&b,一个byte是8个字节的,除了低八位是固定的,其余都是随机的。而0xff第八位都是1,其余都是0,他们相与的结果就是b的第八位依旧不变,其余位都变成了0,这样可以保证数据统一,不至于最后加密的数据不一致。

第三个问题,为什么要用int,因为int是32位的,而我就是要加密成32位的数据,所以有必要使用int。

以上是我对MD5加密代码的理解。
 

java MD5加密