欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java的MD5工具类和客户端测试类

程序员文章站 2022-03-02 10:27:18
什么是md5?message digest algorithm md5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为rfc 1321(...

什么是md5?

message digest algorithm md5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为rfc 1321(r.rivest,mit laboratory for computer science and rsa data security inc. april 1992)。

md5即message-digest algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有md5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,md5的前身有md2、md3和md4。

md5算法具有以下特点:

  • 1、压缩性:任意长度的数据,算出的md5值长度都是固定的。
  • 2、容易计算:从原数据计算出md5值很容易。
  • 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的md5值都有很大区别。
  • 4、强抗碰撞:已知原数据和其md5值,想找到一个具有相同md5值的数据(即伪造数据)是非常困难的。

一个工具类

package com.huaidan.utils;


import java.io.unsupportedencodingexception;
import java.security.messagedigest;
import java.security.nosuchalgorithmexception;
import java.security.securerandom;
import java.util.arrays;

public class mymd5util {



    private static final string hex_nums_str="0123456789abcdef";

    private static final integer salt_length = 12;



    /**

     * 将16进制字符串转换成字节数组

     * @param hex

     * @return

     */

    public static byte[] hexstringtobyte(string hex) {

        int len = (hex.length() / 2);

        byte[] result = new byte[len];

        char[] hexchars = hex.tochararray();

        for (int i = 0; i < len; i++) {

            int pos = i * 2;

            result[i] = (byte) (hex_nums_str.indexof(hexchars[pos]) << 4

                    | hex_nums_str.indexof(hexchars[pos + 1]));

        }

        return result;

    }





    /**

     * 将指定byte数组转换成16进制字符串

     * @param b

     * @return

     */

    public static string bytetohexstring(byte[] b) {

        stringbuffer hexstring = new stringbuffer();

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

            string hex = integer.tohexstring(b[i] & 0xff);

            if (hex.length() == 1) {

                hex = '0' + hex;

            }

            hexstring.append(hex.touppercase());

        }

        return hexstring.tostring();

    }



    /**

     * 验证口令是否合法

     * @param password

     * @param passwordindb

     * @return

     * @throws nosuchalgorithmexception

     * @throws unsupportedencodingexception

     */

    public static boolean validpassword(string password, string passwordindb)

            throws nosuchalgorithmexception, unsupportedencodingexception {

        //将16进制字符串格式口令转换成字节数组

        byte[] pwdindb = hexstringtobyte(passwordindb);

        //声明盐变量

        byte[] salt = new byte[salt_length];

        //将盐从数据库中保存的口令字节数组中提取出来

        system.arraycopy(pwdindb, 0, salt, 0, salt_length);

        //创建消息摘要对象

      
        messagedigest md = messagedigest.getinstance("md5");

        //将盐数据传入消息摘要对象

        md.update(salt);

        //将口令的数据传给消息摘要对象

        md.update(password.getbytes("utf-8"));

        //生成输入口令的消息摘要

        byte[] digest = md.digest();

        //声明一个保存数据库中口令消息摘要的变量

        byte[] digestindb = new byte[pwdindb.length - salt_length];

        //取得数据库中口令的消息摘要

        system.arraycopy(pwdindb, salt_length, digestindb, 0, digestindb.length);

        //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同

        if (arrays.equals(digest, digestindb)) {

            //口令正确返回口令匹配消息

            return true;

        } else {

            //口令不正确返回口令不匹配消息

            return false;

        }

    }





    /**

     * 获得加密后的16进制形式口令

     * @param password

     * @return

     * @throws nosuchalgorithmexception

     * @throws unsupportedencodingexception

     */

    public static string getencryptedpwd(string password)

            throws nosuchalgorithmexception, unsupportedencodingexception {

        //声明加密后的口令数组变量

        byte[] pwd = null;

        //随机数生成器

        securerandom random = new securerandom();

        //声明盐数组变量

        byte[] salt = new byte[salt_length];

        //将随机数放入盐变量中

        random.nextbytes(salt);



        //声明消息摘要对象

        messagedigest md = null;

        //创建消息摘要

        md = messagedigest.getinstance("md5");

        //将盐数据传入消息摘要对象

        md.update(salt);

        //将口令的数据传给消息摘要对象

        md.update(password.getbytes("utf-8"));

        //获得消息摘要的字节数组

        byte[] digest = md.digest();



        //因为要在口令的字节数组中存放盐,所以加上盐的字节长度

        pwd = new byte[digest.length + salt_length];

        //将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐

        system.arraycopy(salt, 0, pwd, 0, salt_length);

        //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节

        system.arraycopy(digest, 0, pwd, salt_length, digest.length);

        //将字节数组格式加密后的口令转化为16进制字符串格式的口令

        return bytetohexstring(pwd);

    }

}

测试类客户端

package com.huaidan.test;


import com.huaidan.utils.mymd5util;

import java.io.unsupportedencodingexception;
import java.security.nosuchalgorithmexception;
import java.util.hashmap;
import java.util.map;

public class client {

    private static map users = new hashmap();



    public static void main(string[] args){



        string username = "zyg";

        string password = "123";

        registeruser(username,password);



        username = "changong";

        password = "456";

        registeruser(username,password);



        string loginuserid = "zyg";

        string pwd = "123";

        try {

            if(loginvalid(loginuserid,pwd)){

                system.out.println("欢迎登陆!!!");

            }else{

                system.out.println("口令错误,请重新输入!!!");

            }

        } catch (nosuchalgorithmexception e) {

            // todo auto-generated catch block

            e.printstacktrace();

        } catch (unsupportedencodingexception e) {

            // todo auto-generated catch block

            e.printstacktrace();

        }

    }



    /**

     * 注册用户

     *

     * @param username

     * @param password

     */

    public static void registeruser(string username,string password){

        string encryptedpwd = null;

        try {

            encryptedpwd = mymd5util.getencryptedpwd(password);



            system.out.println("加密后的用户密码"+encryptedpwd);

            users.put(username, encryptedpwd);



        } catch (nosuchalgorithmexception e) {

            // todo auto-generated catch block

            e.printstacktrace();

        } catch (unsupportedencodingexception e) {

            // todo auto-generated catch block

            e.printstacktrace();

        }

    }



    /**

     * 验证登陆

     *

     * @param username

     * @param password

     * @return

     * @throws unsupportedencodingexception

     * @throws nosuchalgorithmexception

     */

    public static boolean loginvalid(string username,string password)

            throws nosuchalgorithmexception, unsupportedencodingexception{

        string pwdindb = (string)users.get(username);

        system.out.println(pwdindb);

        if(null!=pwdindb){ // 该用户存在

            return mymd5util.validpassword(password, pwdindb);

        }else{

            system.out.println("不存在该用户!!!");

            return false;

        }

    }

}

到此这篇关于java的md5工具类和客户端测试类的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。

相关标签: Java MD5