MD5加密过程学习

来源:互联网 发布:二维数组是线性结构吗 编辑:程序博客网 时间:2024/04/29 13:17

今天我来学习利用JAVA编程,通过MD5来实现加密,同时实现验证用户登录原理。

主要是 过程:
将原文的byte 文件通过 MD5加密完成 后。再将其转化为我们能看懂的密文(MD5生成的byte数据,我们无法识别)
主要代码如下

package techDemo;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Scanner;import org.junit.Test;import sun.misc.BASE64Encoder;/** * MD5加密算法 * @author<a href="mailto:953801304@qq.com">胡龙华</a> * @version 2017-5-30  下午1:34:51 * @fileName MD5.java */public class MD5 {    public static void main(String[] args) throws Exception {        MessageDigest md = MessageDigest.getInstance("MD5");        // 原文:        String pwd = "12345";        // digese---得到byte数组  加密后的        byte b []= md.digest(pwd.getBytes());        System.out.println(b.length);  // 16        // 再将byte b [] 转化为我们能看的懂 密文        //第一种方式:BASE64Encoder (要导依赖包)        BASE64Encoder bd = new BASE64Encoder();        //密文1:        String strpwd1 = bd.encode(b);        System.out.println(strpwd1);        //第二种方式:自己写代码将byte 数组转化为16进制的并且最后的密文保证长度为32        String strpwd2 = "";        for(byte i:b){            // 将单个字节转化为 16 进制            String s = Integer.toHexString(i & 0xff);            // 当i<16时,长度为1加个符号 ,这样可以保证最后为 密文为32            if(s.length()==1){                s = s + "0";            }            strpwd2 += s;        }        System.out.println(strpwd2);/*  输出结果            16        gnzLDuqKcGxMNKFokfhOew==        827ccbe0ea8a706c4c34a16891f84e7b  */    }    // 演示模拟用户登录    @Test    public void demoLogin()throws Exception{        // 当用户注册成功时,把用户的密码生成密文和用户名一起保存        // 登录时,通过把用户输入密码再次生成密文,判断两次密文是否一致来验证用户        // 假设用户密码是 123456789,先生成密文        String pwd = "123456789";        String Mpwd = Md5(pwd);        Scanner sc = new Scanner(System.in);        while(true){            System.out.println("请输入密码");            String p = sc.nextLine();            if(Mpwd.equals( Md5(p))){                System.out.println("密码正确");                break;            }else{                System.out.println("密码错误,请重新输入");            }        }    }    private String Md5(String pwd) throws NoSuchAlgorithmException {        String Mpwd ="";        MessageDigest md = MessageDigest.getInstance("MD5");        byte b [] = md.digest(pwd.getBytes());        for(byte i:b){            String s = Integer.toHexString( i & 0xff);            if(s.length()==1){                s = s +"0";            }            Mpwd = s + pwd;        }        return Mpwd;    }}

下面是 我们老师的代码 更加细节

package techDemo;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import org.junit.Test;import sun.misc.BASE64Encoder;public class Md5Demo {    //加密算法类java.security.MessageDigest    @Test//md5加密的核心代码    public void demo1() throws Exception{        MessageDigest md = MessageDigest.getInstance("MD5");        String pwd="ewi24343423";        byte b1[] = pwd.getBytes();        byte b2[] = md.digest( b1 ); //利用md对象把 明文b1[] 加密成  密文b2[]        //至此,其实md5加密已经完成,可惜它生成的密文全是字节数据,不是我们通常习惯(看得懂)的16进制的数        //因此还要进一步处理---见demo2()演示        System.out.println("len:"+b2.length); //永远是:16 ---md5加密算法中,无论明文数据有多长,密文都是16个字节数据        for(byte b: b2){            //System.out.print(b+" ");            System.out.print((char)b+" ");        }        System.out.println();    }    @Test//把md5生成的密文转换成我们习惯的方式---与前面相比,怪字符少一些,但还不是16进制    public void demo2() throws Exception{        MessageDigest md = MessageDigest.getInstance("MD5");        String pwd="ewi24343423";        byte b1[] = pwd.getBytes();        byte b2[] = md.digest( b1 ); //利用md对象把 明文b1[] 加密成  密文b2[]        System.out.println("len:"+b2.length); //永远是:16        BASE64Encoder en = new BASE64Encoder();        String pwd2 = en.encode(b2);        System.out.println(pwd2);    }    /*     * demo2()方法的缺点:     * 1. 密文不是我们最习惯的16进制方式     * 2. 所使用的类BASE64Encoder在API中没有,意味着该类是没有公开     *    给我们程序员用的,因此它如果变动了,我们是无话可说的即不稳定的!     *    ---不在接口中,官方是可以随便更改     */    @Test //自己手动写代码,把md5生成的密文转换成 我们最习惯的16进制方式    public void demo3()throws Exception{        MessageDigest md = MessageDigest.getInstance("MD5");        String pwd="e655656w23";        byte b1[] = pwd.getBytes();        byte b2[] = md.digest( b1 ); //利用md对象把 明文b1[] 加密成  密文b2[]        System.out.println("len:"+b2.length); //永远是:16        //手动写代码,把16个byte数据 转换成  32个 16进制数        String pwd2="";        for(byte i: b2){            String s = Integer.toHexString(i & 0xff); //如果i<16则s只有一位,只有>=16的i转换成的s才是两位            if(s.length()==1){                s ="0"+s; // s ="f"+s;            }            pwd2 +=s;        }        pwd2 = pwd2.toUpperCase();        System.out.println(pwd2.length());        System.out.println(pwd2);    }}
原创粉丝点击