文档库

最新最全的文档下载
当前位置:文档库 > MD5加密的Java实现

MD5加密的Java实现

一、实验目的

通过实验了解MD5加密的原理,掌握Java语言MD5加密的实现。

二、实验原理

1.哈希(Hash)函数的定义

实现数字签名或计算消息的鉴别码。

以任意长度的消息作为输入,输出一个固定长度的二进制值,称为哈希值或消息摘要。

2.MD(Message Digest)消息摘要

MD5对任意输入的消息计算一个128位的固定长度的值

3.MD5的应用

(1)用于校验下载的文件

可用MD5校验工具软件计算,相当于文件的指纹,32位字母数字

常用于软件下载网站

网站:

先计算文件的MD5值,然后和文件一起发布到网站上。

用户:

下载文件后,计算文件的MD5值,和网站发布的MD5值核对。

(2)将用户密码加密后保存

注册时:

将用户的注册密码(P1)用MD5算法加密后(P2)保存到服务器数据库中;

登录时:

将用户的登录密码(P3)用MD5算法加密后(P4),与服务器数据库中的密文密码(P2)比较。

三、实验环境

开发工具:JDK、Eclipse或JCreator

参考资料:JDK API文档

java.security包MessageDigest类

四、实验内容和任务

使用Java语言编程,计算字符串的MD5值,分别用非图形界面程序和图形界面程序实现。

模拟注册和登录过程,使用MD5加密处理密码。

五、实验要求

(1)用java.security包的MessageDigest类创建对象,调用update( )和digest( )方法,

计算字符串的MD5值,分别用非图形界面程序和图形界面程序实现;

(2)注册时输入用户名和密码,把密码进行MD5加密后保存在变量里;

(3)登录时,输入用户名和密码,把密码进行MD5加密后,和注册时保存的用户名和密码比较,判断是否登录成功。

六、实验代码

计算字符串MD5代码

package Md5;

import java.security.MessageDigest;

import java.util.Scanner;

public class Md5Util {

private static MessageDigest md5 = null;

static {

try {

md5 = MessageDigest.getInstance("MD5");

} catch (Exception e) {

System.out.println(e.getMessage());

}

}

public static String getMd5(String str) {

byte[] bs = md5.digest(str.getBytes());

StringBuilder sb = new StringBuilder(40);

for(byte x:bs) {

if((x & 0xff)>>4 == 0) {

sb.append("0").append(Integer.toHexString(x & 0xff));

} else {

sb.append(Integer.toHexString(x & 0xff));

}

}

return sb.toString();

}

public static void main(String[] args) {

Scanner s = new Scanner(System.in);

String str = null;

System.out.println("请输入您想输入的字符串:");

str = s.next();

System.out.println(getMd5("s.next()"));

}

}

登录对密码进行加密

package http://www.wendangku.net/doc/3da99404b9f3f90f77c61b7f.htmlposer;

import java.security.MessageDigest;

/**

* 对密码进行加密和验证的类

*/

public class CipherUtil{

private final static String[] hexDigits = {"0", "1", "2", "3", "4",

"5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

/** * 把inputString加密 */

public static String generatePassword(String inputString){

return encodeByMD5(inputString);

}

public static boolean validatePassword(String password, String inputString){ if(password.equals(encodeByMD5(inputString))){

return true;

} else{

return false;

}

}

public static String returnEncodeByMde(String originString){

return encodeByMD5(originString);

}

/** 对字符串进行MD5加密 */

private static String encodeByMD5(String originString){

if (originString != null){

try{

MessageDigest md = MessageDigest.getInstance("MD5");

//使用指定的字节数组对摘要进行最后更新,然后完成摘要计算

byte[] results = md.digest(originString.getBytes());

//将得到的字节数组变成字符串返回

String resultString = byteArrayToHexString(results);

String pass = resultString.toUpperCase();

return pass;

} catch(Exception ex){

ex.printStackTrace();

}

}

return null;

}

private static String byteArrayToHexString(byte[] b){ StringBuffer resultSb = new StringBuffer();

for (int i = 0; i < b.length; i++){

resultSb.append(byteToHexString(b[i]));

}

return resultSb.toString();

}

/** 将一个字节转化成十六进制形式的字符串 */

private static String byteToHexString(byte b){

int n = b;

if (n < 0)

n = 256 + n;

int d1 = n / 16;

int d2 = n % 16;

return hexDigits[d1] + hexDigits[d2];

}

public static void main(String[] args){

String pwd1="123";

String pwd2="";

CipherUtil cipher = new CipherUtil();

System.out.println("未加密的密码:"+pwd1); //将123加密

pwd2 = cipher.generatePassword(pwd1);

System.out.println("加密后的密码:"+pwd2);

System.out.print("验证密码是否下确:");

if(cipher.validatePassword(pwd2, pwd1)) { System.out.println("正确");

}

else {

System.out.println("错误");

}

}

}

加密

login.setPassword(CipherUtil.generatePassword(aduser1.getValue()));

login.setPassword(CipherUtil.generatePassword(aduser1.getValue()));

login.setPassword(CipherUtil.generatePassword(aduser1.getValue()));

密码验证

//在用户表里查询出用户名和密码,并检验密码是否正确

Login login = loginDAO.queryByUser(userName.getValue(),CipherUtil.returnEncodeByMde(password. getValue()) );

Login login = loginDAO.queryByUser(userName.getValue(),CipherUtil.returnEncodeByMde(password. getValue()) );

Login login = loginDAO.queryByUser(userName.getValue(),CipherUtil.returnEncodeByMde(password. getValue()) );

import java.security.*;

public class Encrypter

{

// 用MD5算法加密字符串

public static String md5Encrypt(String s) throws Exception

{

// 获得支持MD5算法的MessageDigest

MessageDigest md5 = MessageDigest.getInstance("MD5");

// 获得BASE64Encoder对象,用Base64格式对字符串进行编码

sun.misc.BASE64Encoder base64Encoder = new sun.misc.BASE64Encoder(); // 对字符串进行加密,并将加密后的字符串按Base64格式进行编码,并将结果返回

return base64Encoder.encode(md5.digest(s.getBytes("utf-8")));

}

}

String passwordMD5 = shopservlet.Encrypter.md5Encrypt(password);

// 定义插入记录的SQL语句

String sql = "insert into t_users(user_name, password_md5, email) values(?, ?, ?)";

// 执行SQL语句

execSQL(sql, userName, passwordMD5, email);

request.setAttribute("info", "用户注册成功!");

七、实验总结

通过本次试验我了解了如何使用Java语言进行计算字符串的MD5值,并且学会了怎么对相应的密码进行MD5加密,使使用者的信息得到更加安全的保护。