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

相关推荐

  • 为什么应该选择美国服务器服务器租用美国

    技术为什么应该选择美国服务器服务器租用美国在海外服务器上搭建您的网站时,美国服务器都是您应该考虑的选项。以下是为什么应该选择美国服务器的原因专业技术支持 人们应该选择美国服务器租用服务的主要原因是它提供的技术支持。无论发

    礼包 2021年12月17日
  • Flex应用的误区有哪些

    技术Flex应用的误区有哪些这篇文章给大家分享的是有关Flex应用的误区有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex应用的十大误区1.使用RIA框架去构建Web1.0应用(新技

    攻略 2021年12月4日
  • 怎么使用物联网设备来确保儿童安全

    技术怎么使用物联网设备来确保儿童安全这篇文章将为大家详细讲解有关怎么使用物联网设备来确保儿童安全,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。IoT 设备是什么?IoT 设备是指那些在

    攻略 2021年10月26日
  • 中庭是什么意思,中庭地白树栖鸦的中庭什么意思

    技术中庭是什么意思,中庭地白树栖鸦的中庭什么意思中庭:即庭中,庭院中中庭是什么意思。地白:指月光照在庭院的样子。
    译:中秋月光洒落中庭,清冷树枝安栖乌鸦,地上洁白,天空宁静。
    扩展资料:此诗是诗人在中秋佳节与朋友相聚时所

    生活 2021年10月24日
  • miniui datagrid的客户端分页解决方法是怎样的

    技术miniui datagrid的客户端分页解决方法是怎样的这期内容当中小编将会给大家带来有关miniui datagrid的客户端分页解决方法是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大

    攻略 2021年11月16日
  • html5新增标签是什么(html5视频标签是哪个)

    技术html5视频标签是哪个小编给大家分享一下html5视频标签是哪个,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    攻略 2021年12月17日