java 中 MD5加密的实例
程序员文章站
2024-03-02 08:01:34
java 中 md5加密的实例
前言:
今天我来学习利用java编程,通过md5来实现加密,同时实现验证用户登录原理。
主要是 过程:
将原文的byte 文件...
java 中 md5加密的实例
前言:
今天我来学习利用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" rel="external nofollow" >胡龙华</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); } }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: CSS之自动换行