标签:
今天在写注册登录的时候想起来为密码做一个加密,于是去网上搜索用哪方面的技术,最后确定了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加密代码的理解。
标签:
原文地址:http://www.cnblogs.com/claireyu1219/p/5832030.html