md5加密算法学习

1、什么是md5加密算法?

学习之前对md5的了解:

在我看到md5算法的时候,我一直以为就是对字符串进行模5的一种很简单的算法,但是现在学习以后才知道原来这是一个很复杂的算法,而且现在应用也很广泛。比如说:数字签名。(数字签名的应用:举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用)括号内是引用百度百科的内容

学习之后对md5的感觉:

md5的全名是:Message-Digest Algorithm 5(信息-摘要算法5)。

它的主要特点是:可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。

md5的发展历程:技术不论大小,任何一门科学都是慢慢发展来的。同样的md5发展到现在是有其一定的历史的。经过查阅资料,我了解到它有几个版本:md1、md2、md3、md4这几个版本,这些版本的差异这里就不说了。

2、md5加密算法用代码实现(java)?

  1. package view.login.composer;
  2. import java.security.MessageDigest;
  3. /**
  4. * 对密码进行加密和验证的类
  5. */
  6. public class CipherUtil{
  7. private final static String[] hexDigits = {"0", "1", "2", "3", "4",
  8. "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
  9. /** * 把inputString加密 */
  10. public static String generatePassword(String inputString){
  11. return encodeByMD5(inputString);
  12. }
  13. public static boolean validatePassword(String password, String inputString){
  14. if(password.equals(encodeByMD5(inputString))){
  15. return true;
  16. } else{
  17. return false;
  18. }
  19. }
  20. public static String returnEncodeByMde(String originString){
  21. return encodeByMD5(originString);
  22. }
  23. /** 对字符串进行MD5加密 */
  24. private static String encodeByMD5(String originString){
  25. if (originString != null){
  26. try{
  27. MessageDigest md = MessageDigest.getInstance("MD5");
  28. //返回值为存放哈希值结果的byte数组,
  29. byte[] results = md.digest(originString.getBytes());
  30. //将得到的字节数组变成字符串返回
  31. String resultString = byteArrayToHexString(results);
  32. String pass = resultString.toUpperCase();
  33. return pass;
  34. } catch(Exception ex){
  35. ex.printStackTrace();
  36. }
  37. }
  38. return null;
  39. }
  40. private static String byteArrayToHexString(byte[] b){
  41. StringBuffer resultSb = new StringBuffer();
  42. for (int i = 0; i < b.length; i++){
  43. resultSb.append(byteToHexString(b[i]));
  44. }
  45. return resultSb.toString();
  46. }
  47. /** 将一个字节转化成十六进制形式的字符串 */
  48. private static String byteToHexString(byte b){
  49. int n = b;
  50. /**对这个地方加256的理解:
  51. 1、要用16进制来表示就是要用两个hexDigits数组里面的元素:16*16=256,所以要把n限制在0~256的范围内
  52. 2、要想把n限制在0~256的范围内,我们就要处理b这个字节,我们先把b转化为整数,转化为整数的时候有分有符号和无符号的
  53. 有符号的b的范围是-127~127,无符号的范围是0~256。我们现在用的都是有符号的类型,所以就有负数存在,我们就要把它转化为正数,但是转化为正数我们可以加127~256之间的任何一个数,为什么我们要加256呢?以下是个人的见解:
  54. 我们知道:b转化为整数是-127~-1和0~127。正数部分占居了0~127,接下来就剩下128~255(注意不能有256,因为256/16=16这样数组就越界了)
  55. -127+256=129
  56. -1+256=255
  57. 转化以后的范围为129~255,没有了128(不知道为什么),这样就除了128没有取到,其他的数字都有可能取到,基于这种算法,我推出
  58. 这样改
  59. if(n<=0){
  60. n=255+n;
  61. }
  62. */
  63. if (n < 0)
  64. n = 256 + n;
  65. int d1 = n / 16;
  66. int d2 = n % 16;
  67. return hexDigits[d1] + hexDigits[d2];
  68. }
  69. public static void main(String[] args){
  70. String pwd1="123";
  71. String pwd2="";
  72. CipherUtil cipher = new CipherUtil();
  73. System.out.println("未加密的密码:"+pwd1);
  74. //将123加密
  75. pwd2 = cipher.generatePassword(pwd1);
  76. System.out.println("加密后的密码:"+pwd2);
  77. System.out.print("验证密码是否下确:");
  78. if(cipher.validatePassword(pwd2, pwd1)) {
  79. System.out.println("正确");
  80. }
  81. else {
  82. System.out.println("错误");
  83. }
  84. }
  85. }

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值