zoukankan      html  css  js  c++  java
  • 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加密代码的理解。
     
  • 相关阅读:
    xshell,putty远程连接Linux并使用密钥认证
    配置IP
    认识linux
    dpkg: error processing package libraspberrypi-doc (--configure): package is in a very bad inconsistent state;
    pi4j,Netbeans中togglebutton跟Jbutton的区别
    Netbeans配置Java SE嵌入式平台(树莓派)
    发光二极管正负极判断
    Eclipse安装图形JFrame,Jswing编程界面
    阿里云Centos6.9安装图形化界面
    Oracle 一个中文汉字 占用几个字节,由Oracle中字符集编码决定
  • 原文地址:https://www.cnblogs.com/claireyu1219/p/5832030.html
Copyright © 2011-2022 走看看