message digest algorithm md5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用音乐电台节目稿的一种散列函数,用以提供消息的完整性保护。该算法的文件号为rfc 1321(r.rivest,mit laboratory for computer science and rsa data curity 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.curity.messagedigest;import java.curity.nosuchalgorithmexception;import java.curity.curerandom;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] & 0xf勤学好问的小故事f); if (hex.length() == 1) { hex = '0' + hex; } hexstring.append(hex.toupperca()); } 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.g他夏了夏天 苏打绿etbytes("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; } el { //口令不正确返回口令不匹配消息 return fal; } } /** * 获得加密后的16进制形式口令 * @param password * @return * @throws nosuchalgorithmexception * @throws unsupportedencodingexception */ public static string getencryptedpwd(string password) throws nosuchalgorithmexception, unsupportedencodingexception { //声明加密后的口令数组变量 byte[] pwd = null; //随机数生成器 curerandom random = new curerandom(); //声明盐数组变量 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.cu爱你不是两三天伴奏rity.nosuchalgorithmexception;import java.util.hashmap;import java.util.map;public class client { private static map urs = new hashmap(); public static void main(string[] args){ st浙江省教师培训ring urname = "zyg"; string password = "123"; registerur(urname,password); urname = "changong"; password = "456"; registerur(urname,password); string loginurid = "zyg"; string pwd = "123"; try { if(loginvalid(loginurid,pwd)){ system.out.println("欢迎登陆!!!"); }el{ system.out.println("口令错误,请重新输入!!!"); } } catch (nosuchalgorithmexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (unsupportedencodingexception e) { // todo auto-generated catch block e.printstacktrace(); } } /** * 注册用户 * * @param urname * @param password */ public static void registerur(string urname,string password){ string encryptedpwd = null; try { encryptedpwd = mymd5util.getencryptedpwd(password); system.out.println("加密后的用户密码"+encryptedpwd); urs.put(urname, encryptedpwd); } catch (nosuchalgorithmexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (unsupportedencodingexception e) { // todo auto-generated catch block e.printstacktrace(); } } /** * 验证登陆 * * @param urname * @param password * @return * @throws unsupportedencodingexception * @throws nosuchalgorithmexception */ public static boolean loginvalid(string urname,string password) throws nosuchalgorithmexception, unsupportedencodingexception{ string pwdindb = (string)urs.get(urname); system.out.println(pwdindb); if(null!=pwdindb){ // 该用户存在 return mymd5util.validpassword(password, pwdindb); }el{ system.out.println("不存在该用户!!!"); return fal; } }}
到此这篇关于java的md5工具类和客户端测试类的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 03:19:37,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/5c7914f421fd7fa36fe4d9e93860d563.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java的MD5工具类和客户端测试类.doc
本文 PDF 下载地址:Java的MD5工具类和客户端测试类.pdf
留言与评论(共有 0 条评论) |