java 中 MD5加密的实例
java中MD5加密的实例
前言:
今天我来学习利用JAVA编程,通过MD5来实现加密,同时实现验证用户登录原理。
主要是过程:
将原文的byte文件通过MD5加密完成后。再将其转化为我们能看懂的密文(MD5生成的byte数据,我们无法识别)
主要代码如下
packagetechDemo; importjava.security.MessageDigest; importjava.security.NoSuchAlgorithmException; importjava.util.Scanner; importorg.junit.Test; importsun.misc.BASE64Encoder; /** *MD5加密算法 *@author胡龙华 *@version2017-5-30下午1:34:51 *@fileNameMD5.java */ publicclassMD5{ publicstaticvoidmain(String[]args)throwsException{ MessageDigestmd=MessageDigest.getInstance("MD5"); //原文: Stringpwd="12345"; //digese---得到byte数组加密后的 byteb[]=md.digest(pwd.getBytes()); System.out.println(b.length);//16 //再将byteb[]转化为我们能看的懂密文 //第一种方式:BASE64Encoder(要导依赖包) BASE64Encoderbd=newBASE64Encoder(); //密文1: Stringstrpwd1=bd.encode(b); System.out.println(strpwd1); //第二种方式:自己写代码将byte数组转化为16进制的并且最后的密文保证长度为32 Stringstrpwd2=""; for(bytei:b){ //将单个字节转化为16进制 Strings=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 publicvoiddemoLogin()throwsException{ //当用户注册成功时,把用户的密码生成密文和用户名一起保存 //登录时,通过把用户输入密码再次生成密文,判断两次密文是否一致来验证用户 //假设用户密码是123456789,先生成密文 Stringpwd="123456789"; StringMpwd=Md5(pwd); Scannersc=newScanner(System.in); while(true){ System.out.println("请输入密码"); Stringp=sc.nextLine(); if(Mpwd.equals(Md5(p))){ System.out.println("密码正确"); break; }else{ System.out.println("密码错误,请重新输入"); } } } privateStringMd5(Stringpwd)throwsNoSuchAlgorithmException{ StringMpwd=""; MessageDigestmd=MessageDigest.getInstance("MD5"); byteb[]=md.digest(pwd.getBytes()); for(bytei:b){ Strings=Integer.toHexString(i&0xff); if(s.length()==1){ s=s+"0"; } Mpwd=s+pwd; } returnMpwd; } }
下面是我们老师的代码更加细节
packagetechDemo; importjava.security.MessageDigest; importjava.security.NoSuchAlgorithmException; importorg.junit.Test; importsun.misc.BASE64Encoder; publicclassMd5Demo{ //加密算法类java.security.MessageDigest @Test//md5加密的核心代码 publicvoiddemo1()throwsException{ MessageDigestmd=MessageDigest.getInstance("MD5"); Stringpwd="ewi24343423"; byteb1[]=pwd.getBytes(); byteb2[]=md.digest(b1);//利用md对象把明文b1[]加密成密文b2[] //至此,其实md5加密已经完成,可惜它生成的密文全是字节数据,不是我们通常习惯(看得懂)的16进制的数 //因此还要进一步处理---见demo2()演示 System.out.println("len:"+b2.length);//永远是:16---md5加密算法中,无论明文数据有多长,密文都是16个字节数据 for(byteb:b2){ //System.out.print(b+""); System.out.print((char)b+""); } System.out.println(); } @Test//把md5生成的密文转换成我们习惯的方式---与前面相比,怪字符少一些,但还不是16进制 publicvoiddemo2()throwsException{ MessageDigestmd=MessageDigest.getInstance("MD5"); Stringpwd="ewi24343423"; byteb1[]=pwd.getBytes(); byteb2[]=md.digest(b1);//利用md对象把明文b1[]加密成密文b2[] System.out.println("len:"+b2.length);//永远是:16 BASE64Encoderen=newBASE64Encoder(); Stringpwd2=en.encode(b2); System.out.println(pwd2); } /* *demo2()方法的缺点: *1.密文不是我们最习惯的16进制方式 *2.所使用的类BASE64Encoder在API中没有,意味着该类是没有公开 *给我们程序员用的,因此它如果变动了,我们是无话可说的即不稳定的! *---不在接口中,官方是可以随便更改 */ @Test//自己手动写代码,把md5生成的密文转换成我们最习惯的16进制方式 publicvoiddemo3()throwsException{ MessageDigestmd=MessageDigest.getInstance("MD5"); Stringpwd="e655656w23"; byteb1[]=pwd.getBytes(); byteb2[]=md.digest(b1);//利用md对象把明文b1[]加密成密文b2[] System.out.println("len:"+b2.length);//永远是:16 //手动写代码,把16个byte数据转换成32个16进制数 Stringpwd2=""; for(bytei:b2){ Strings=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); } }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!