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值的数据(即伪造数据)是非常困难的。
eg:
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); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
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; } } }
MD5是什么?如何使用MD5?相关推荐
- Bootstrap4+MySQL前后端综合实训-Day06-PM【MD5加码-生成32位md5码、ResultData.java、分页查询用户数据、添加用户按钮的实现】
[Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目录 MD5加码 生成32位md5码 ResultData.java 分页查询 ...
- linux获取文件的md5,linux shell 获取文件md5的命令linux操作系统 -电脑资料
下面我给各位朋友总结一下在linux中利用shell命令来获取文件md5及遍历目录下所有文件的md5的例子,希望此例子对各位同学会有所帮助, 获取文件的MD5值: $ md5sum linuxmint ...
- Xshell安装sql报错:······ RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#3a79bd29)
文章目录 Xshell安装sql报错:······ RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#3a79bd29) 报错截图: 分 ...
- MD5算法之C#程序 MD5算法描述
MD5算法之C#程序 MD5算法描述 MD5算法描述 当我要写一个MD5算法的程序时,发现中英文的语言描述都有一些不确切的地方,某些个细节 讲得不清楚,或者说很费解.最后不得不拿出C语言的源程序来调试 ...
- md5 java .net_.net, java MD5 加密 互换
1..net md5 加密 public static String Md5(String input, string encodName = "utf-8") { if (St ...
- md5加密校验 java_Java实现MD5加密和文件校验
MD5简介: MD5的全称:Message-Digest Algorithm 5(信息-摘要算法5) MD5的加密方式是一种哈希加密.一些主流的编程语言都已经实现了MD5的加密,所以如果你的程序或是系 ...
- android apk的md5值,android 获取apk md5值
android 获取apk md5值 1, 获取 Signature 2. 根据Signature计算md5和sha1信息,获取签名公钥信息 TextView text = null; Strin ...
- php md5算法,php如何实现md5算法?
php实现md5算法:1.当数组元素超过整形长度时的自动转换:2.实现无符号右移操作:3.将字符串转换成8位存储为一个元素的数据结构. PHP实现MD5算法: 1.MD5算法是对输入的数据进行补位,使 ...
- java md5 密钥_java代码实现MD5加密及验证方法
MD5加密 在我们的程序中,不管是什么,都会有安全问题,今天就说的是MD5加密的方法 MD5是哈希算法,也就是 从明文A到密文B很容易,但是从密文B到明文A几乎不可能 也就是说,给你密文,是几乎无法通 ...
- MD5的应用场景以及MD5 32位和16位的区别
MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现.将数据(如汉 ...
最新文章
- Python os模块常用命令
- 千千静听4.6.7版发布了
- CornerNet-Lite:CornerNet粗暴优化,加速6倍还提点了 | BMVC 2020
- Python 代码绘制航海王四皇大妈(BIG MOM) - 门卫大爷也能跟着学会的Turtle海龟绘图系列
- 一天搞定CSS:盒模型content、padding、border、margin--06
- 计算机原理期中考试答案,微机原理与接口技术期中考试题(带答案)
- 深度学习(二十八)——SOM, Group Normalization, MobileNet, 花式卷积进阶
- Linux下面MariaDB 管理命令基础使用
- Asp.Net实例:C# 绘制统计图(三) ——扇形统计图的绘制
- 使用tp5.1 model返回数据 显示variable type error: array
- 微波心得2——阻抗匹配
- 马哥linux视频笔记,马哥linux视频的学习笔记
- 学而时习之语言篇: 我工作这么多年, 为什么不能准确读 “音标“ ?
- pytorch torchvision 各种版本whl下载地址
- Java API 帮助文档中英文版下载
- 软件项目管理系统-进度管理
- 计算机主机的三大部分,计算机系统的三大组成部分
- 短视频封面抽取和标题自动化生成
- photoshop之CameraRaw
- 人应该怎样度过自己的一生
热门文章
- 工作中php遇到的问题以及常用函数整理(持续更新)
- 常识整理-windows7旗舰版x86用激活程序激活失败,提示:请用管理员运行
- Happy 2004(积性函数、快速幂取模、费马小定理、求因数和)
- 360浏览器(网页)无法打开百度网盘解决办法
- 解决esp-idf-5.0编译时报错:Component “tinyusb“ does not support target esp32
- 微信公众平台开发,第一章
- R语言统计与分析第六周总结
- 二分图(三)——KM算法
- 被封杀4年的看片神器终于解禁了,要跟百度网盘抢生意?(末尾送书)
- php 对字母排序,PHP按字母顺序排序