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?相关推荐

  1. Bootstrap4+MySQL前后端综合实训-Day06-PM【MD5加码-生成32位md5码、ResultData.java、分页查询用户数据、添加用户按钮的实现】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目录 MD5加码 生成32位md5码 ResultData.java 分页查询 ...

  2. linux获取文件的md5,linux shell 获取文件md5的命令linux操作系统 -电脑资料

    下面我给各位朋友总结一下在linux中利用shell命令来获取文件md5及遍历目录下所有文件的md5的例子,希望此例子对各位同学会有所帮助, 获取文件的MD5值: $ md5sum linuxmint ...

  3. 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) 报错截图: 分 ...

  4. MD5算法之C#程序 MD5算法描述

    MD5算法之C#程序 MD5算法描述 MD5算法描述 当我要写一个MD5算法的程序时,发现中英文的语言描述都有一些不确切的地方,某些个细节 讲得不清楚,或者说很费解.最后不得不拿出C语言的源程序来调试 ...

  5. md5 java .net_.net, java MD5 加密 互换

    1..net  md5 加密 public static String Md5(String input, string encodName = "utf-8") { if (St ...

  6. md5加密校验 java_Java实现MD5加密和文件校验

    MD5简介: MD5的全称:Message-Digest Algorithm 5(信息-摘要算法5) MD5的加密方式是一种哈希加密.一些主流的编程语言都已经实现了MD5的加密,所以如果你的程序或是系 ...

  7. android apk的md5值,android 获取apk md5值

    android 获取apk md5值 1, 获取 Signature 2.   根据Signature计算md5和sha1信息,获取签名公钥信息 TextView text = null; Strin ...

  8. php md5算法,php如何实现md5算法?

    php实现md5算法:1.当数组元素超过整形长度时的自动转换:2.实现无符号右移操作:3.将字符串转换成8位存储为一个元素的数据结构. PHP实现MD5算法: 1.MD5算法是对输入的数据进行补位,使 ...

  9. java md5 密钥_java代码实现MD5加密及验证方法

    MD5加密 在我们的程序中,不管是什么,都会有安全问题,今天就说的是MD5加密的方法 MD5是哈希算法,也就是 从明文A到密文B很容易,但是从密文B到明文A几乎不可能 也就是说,给你密文,是几乎无法通 ...

  10. MD5的应用场景以及MD5 32位和16位的区别

    MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现.将数据(如汉 ...

最新文章

  1. Python os模块常用命令
  2. 千千静听4.6.7版发布了
  3. CornerNet-Lite:CornerNet粗暴优化,加速6倍还提点了 | BMVC 2020
  4. Python 代码绘制航海王四皇大妈(BIG MOM) - 门卫大爷也能跟着学会的Turtle海龟绘图系列
  5. 一天搞定CSS:盒模型content、padding、border、margin--06
  6. 计算机原理期中考试答案,微机原理与接口技术期中考试题(带答案)
  7. 深度学习(二十八)——SOM, Group Normalization, MobileNet, 花式卷积进阶
  8. Linux下面MariaDB 管理命令基础使用
  9. Asp.Net实例:C# 绘制统计图(三) ——扇形统计图的绘制
  10. 使用tp5.1 model返回数据 显示variable type error: array
  11. 微波心得2——阻抗匹配
  12. 马哥linux视频笔记,马哥linux视频的学习笔记
  13. 学而时习之语言篇: 我工作这么多年, 为什么不能准确读 “音标“ ?
  14. pytorch torchvision 各种版本whl下载地址
  15. Java API 帮助文档中英文版下载
  16. 软件项目管理系统-进度管理
  17. 计算机主机的三大部分,计算机系统的三大组成部分
  18. 短视频封面抽取和标题自动化生成
  19. photoshop之CameraRaw
  20. 人应该怎样度过自己的一生

热门文章

  1. 工作中php遇到的问题以及常用函数整理(持续更新)
  2. 常识整理-windows7旗舰版x86用激活程序激活失败,提示:请用管理员运行
  3. Happy 2004(积性函数、快速幂取模、费马小定理、求因数和)
  4. 360浏览器(网页)无法打开百度网盘解决办法
  5. 解决esp-idf-5.0编译时报错:Component “tinyusb“ does not support target esp32
  6. 微信公众平台开发,第一章
  7. R语言统计与分析第六周总结
  8. 二分图(三)——KM算法
  9. 被封杀4年的看片神器终于解禁了,要跟百度网盘抢生意?(末尾送书)
  10. php 对字母排序,PHP按字母顺序排序