java 中 MD5加密的实例

2025-05-29 0 34

java 中 MD5加密的实例

前言:

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

主要是 过程:

将原文的byte 文件通过 MD5加密完成 后。再将其转化为我们能看懂的密文(MD5生成的byte数据,我们无法识别)

主要代码如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89
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;

}

}

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77
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);

}

}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/weixin_37720904/article/details/72809769

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 java 中 MD5加密的实例 https://www.kuaiidc.com/114989.html

相关文章

发表评论
暂无评论