码迷,mamicode.com
首页 > 编程语言 > 详细

java MD5加密

时间:2016-09-02 07:41:13      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

今天在写注册登录的时候想起来为密码做一个加密,于是去网上搜索用哪方面的技术,最后确定了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加密

标签:

原文地址:http://www.cnblogs.com/claireyu1219/p/5832030.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!