Java的MD5工具类和客户端测试类怎么使用
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要讲解了"Java的MD5工具类和客户端测试类怎么使用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java的MD5工具类和客户端测试类怎么
千家信息网最后更新 2025年11月13日Java的MD5工具类和客户端测试类怎么使用
这篇文章主要讲解了"Java的MD5工具类和客户端测试类怎么使用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java的MD5工具类和客户端测试类怎么使用"吧!
什么是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工具类和客户端测试类怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
口令
消息
摘要
数据
字节
数组
算法
对象
加密
客户
客户端
工具
测试
变量
进制
字符
字符串
数据库
用户
长度
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
20年国家网络安全主题
云集成服务器
社区网络安全工作责任制实施细则
网络安全的手抄报模板图片
哪些软件开发智力
php数据库密码不对
saas软件开发标准
小学生网络安全前言
东南大学网络安全学费
公安网络安全边界规范
广联达专家软件开发工程师
网络安全技术实务精讲
计算机网络技术有女孩子吗
数据库技术小结
广西农场游戏软件开发培训班
惠普服务器进入阵列卡
密云区正规软件开发诚信服务
软件开发中多条明细怎样暂存
软件开发人员技能大赛
路由器拨号上网老是服务器无响应
特斯拉网络安全审查
计算机考试数据库建立
三门峡乐上软件开发公司
七日杀卡在配置文件进不去服务器
拼测服务器出现拼测延时
淄博采购软件开发
scum怎么租香港服务器
网络技术博客csdn
游戏个人角色信息与服务器的交互
数据库系统组成包含哪些部分