如何使用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)

相关推荐

  • mysql中too many files问题open_files_limit值更改无效怎么办

    技术mysql中too many files问题open_files_limit值更改无效怎么办小编给大家分享一下mysql中too many files问题open_files_limit值更改无效怎么办,希望大家阅读

    攻略 2021年11月6日
  • ajax技术的用法(ajax技术怎么用)

    技术Ajax技术怎么用这篇文章主要介绍了Ajax技术怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 ajax的作用有:1

    攻略 2021年12月17日
  • 野心勃勃是什么意思,为什么二战时日本那么野心勃勃

    技术野心勃勃是什么意思,为什么二战时日本那么野心勃勃日本的野心,主要就是我们所熟悉的“大陆政策”野心勃勃是什么意思。而日本在二战时的疯狂,主要源于三方面。第一, 是军国主义盛行。
    日本军国主义虽然在近代才开始践行,却

    生活 2021年10月24日
  • 恳求的拼音,请写出“乞求”的四个近义词

    技术恳求的拼音,请写出“乞求”的四个近义词乞求的近义词有恳求的拼音:请求、祈求、恳求、哀求、央求。【请求】拼音:qǐngqiú释义:1.以私事相求;走门路,通关节。
    2.指受人请托,收受贿赂之事。

    生活 2021年10月29日
  • 怎么使用PostgreSQL的插件pgmetries

    技术怎么使用PostgreSQL的插件pgmetries这篇文章主要介绍“怎么使用PostgreSQL的插件pgmetries”,在日常操作中,相信很多人在怎么使用PostgreSQL的插件pgmetries问题上存在疑

    攻略 2021年11月8日
  • 如何进行python的merge理解

    技术如何进行python的merge理解如何进行python的merge理解,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。mergepandas的merge

    攻略 2021年12月4日