如何使用Java的MD5工具类和客户端测试类

技术Java的MD5工具类和客户端测试类怎么使用这篇文章主要讲解了“Java的MD5工具类和客户端测试类怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的M

本文主要讲解“如何使用Java MD5工具类和客户端测试类”。本文的解释简单明了,易学易懂。接下来,请跟随边肖的思路,一起学习学习“如何使用Java MD5工具类和客户端测试类”!

什么是MD5?

消息摘要算法MD5(第五版中文消息摘要算法)是一种广泛应用于计算机安全领域的哈希函数,为消息提供完整性保护。该算法的文件编号为RFC 1321(麻省理工学院计算机科学实验室和RSA数据安全公司,1992年4月)。

MD5是消息摘要算法5(信息摘要算法5),用于保证信息传输的完整性和一致性。它是计算机广泛使用的哈希算法之一(也称为摘要算法和哈希算法),MD5在主流编程语言中得到了广泛的实现。哈希算法的基本原理是将数据(如汉字)计算成另一个固定长度的值。MD5以MD2、MD3、MD4为前辈。

MD5算法具有以下特点:

1.可压缩性:对于任意长度的数据,计算出的MD5值的长度是固定的。

2.容易计算:从原始数据计算MD5值很容易。

3.反修改:如果对原始数据做任何修改,即使只修改一个字节,得到的MD5值也会大不相同。

4.强防碰撞:给定原始数据及其MD5值,很难找到一个MD5值相同的数据(即伪造数据)。

一个工具类

package com . Huai Dan . utils;

import Java . io . unsupportedencodinegexception;

import Java . security . messagedigest;

import Java . security . nosuchalgorithm异常;

import Java . security . securerandom;

import Java . util . arrays;

publicclassMyMD5Util{

privatedstatifindringhex _ NUMS _ STR=' 0123456789 abcdef ';

privatedstatifinaintegersalt _ LENGTH=12;

/**

*将十六进制字符串转换为字节数组。

*@paramhex

* @返回

*/

public static byte[]HexStringTobyte(Stringhex){ 0

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

byte[]结果=new byte[len];

char[]HexChars=hex . tochararray();

for(inti=0;伊琳;I){ 0

int pos=I * 2;

结果[i]=(字节)(十六进制_ NUMS _字符串.索引Of(十六进制字符[位置])

 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工具类和客户端测试类怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/149065.html

(0)

相关推荐

  • 如何使用mysqldump对mysql进行备份和恢复

    技术如何使用mysqldump对mysql进行备份和恢复这篇文章给大家分享的是有关如何使用mysqldump对mysql进行备份和恢复的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mysqld

    攻略 2021年11月3日
  • 另一个英语,北影考研英语是英语1还是英语2

    技术另一个英语,北影考研英语是英语1还是英语2英语一和英语二是针对学术型和专业型硕士另一个英语,如果你要教育学学术型硕士就考英语一,如果你要考专业型硕士就考英语二。###前面那个说的也不是完全准确的,具体考英语一还是英语

    生活 2021年10月27日
  • 初探卡特兰数及有关问题

    技术初探卡特兰数及有关问题 初探卡特兰数及有关问题星期日,哥参加了上大学以来的第一次计算导论与程序设计的上机考试,可是最后一道题没AC。
    这道题给了卡特兰数的一种通项公式,让你求卡特兰数的第n项。
    从考

    礼包 2021年11月26日
  • 为您的物联网系统选择合适的数据库的4个步骤分别是什么

    技术为您的物联网系统选择合适的数据库的4个步骤分别是什么本篇文章为大家展示了为您的物联网系统选择合适的数据库的4个步骤分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。为物

    攻略 2021年12月2日
  • P2568 GCD,线性筛-欧拉函数 模板)

    技术P2568 GCD,线性筛-欧拉函数 模板) P2568 GCD(线性筛-欧拉函数 模板)有两个易错点:
    1.欧拉函数的定义是1到n内互质的数,但是“互质”不一定要都是质数,其实就只需要gcd(a,

    礼包 2021年12月9日
  • 我的学习旅程

    技术我的学习旅程 我的学习旅程学习JAVA最基础也是最难的在学习的开始期间也总是怀疑自己没有动手能力,是否能够坚持下去,但不断对自己说这是我的兴趣爱好,我要慢慢;慢慢地走
    学习思路 每次在学习新地知识点

    礼包 2021年12月23日