完整MD5例子
- 格式:docx
- 大小:14.06 KB
- 文档页数:3
微信⼩程序MD5加密登录密码详解及实例代码微信⼩程序 MD5加密在⼩程序中,页⾯的脚本逻辑是在JsCore中运⾏,JsCore是⼀个没有窗⼝对象的环境,所以不能在脚本中使⽤window,也⽆法在脚本中操作组件。
zepto/jquery 也⽆法使⽤,因为zepto/jquery 会使⽤到window对象和document对象。
所以在微信⼩程序中不能使⽤jquery.md5.js对密码进⾏加密。
下⾯我提供⼀种MD5.js加密实例,本实例先静态演⽰,后⾯再到⼩程序中演⽰。
md5.js程序如下:/** A JavaScript implementation of the RSA Data Security, Inc. MD5 Message* Digest Algorithm, as defined in RFC 1321.* Version 1.1 Copyright (C) Paul Johnston 1999 - 2002.* Code also contributed by Greg Holt* See /site/legal.html for details.*//** Add integers, wrapping at 2^32. This uses 16-bit operations internally* to work around bugs in some JS interpreters.*/function safe_add(x, y){var lsw = (x & 0xFFFF) + (y & 0xFFFF)var msw = (x >> 16) + (y >> 16) + (lsw >> 16)return (msw << 16) | (lsw & 0xFFFF)}/** Bitwise rotate a 32-bit number to the left.*/function rol(num, cnt){return (num << cnt) | (num >>> (32 - cnt))}/** These functions implement the four basic operations the algorithm uses.*/function cmn(q, a, b, x, s, t){return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)}function ff(a, b, c, d, x, s, t){return cmn((b & c) | ((~b) & d), a, b, x, s, t)}function gg(a, b, c, d, x, s, t){return cmn((b & d) | (c & (~d)), a, b, x, s, t)}function hh(a, b, c, d, x, s, t){return cmn(b ^ c ^ d, a, b, x, s, t)}function ii(a, b, c, d, x, s, t){return cmn(c ^ (b | (~d)), a, b, x, s, t)}/** Calculate the MD5 of an array of little-endian words, producing an array* of little-endian words.*/function coreMD5(x){var a = 1732584193var b = -271733879var c = -1732584194var d = 271733878for(i = 0; i < x.length; i += 16)var olda = avar oldb = bvar oldc = cvar oldd = da = ff(a, b, c, d, x[i+ 0], 7 , -680876936)d = ff(d, a, b, c, x[i+ 1], 12, -389564586) c = ff(c, d, a, b, x[i+ 2], 17, 606105819)b = ff(b, c, d, a, x[i+ 3], 22, -1044525330) a = ff(a, b, c, d, x[i+ 4], 7 , -176418897)d = ff(d, a, b, c, x[i+ 5], 12, 1200080426) c = ff(c, d, a, b, x[i+ 6], 17, -1473231341) b = ff(b, c, d, a, x[i+ 7], 22, -45705983)a = ff(a, b, c, d, x[i+ 8], 7 , 1770035416) d = ff(d, a, b, c, x[i+ 9], 12, -1958414417) c = ff(c, d, a, b, x[i+10], 17, -42063)b = ff(b, c, d, a, x[i+11], 22, -1990404162) a = ff(a, b, c, d, x[i+12], 7 , 1804603682) d = ff(d, a, b, c, x[i+13], 12, -40341101)c = ff(c, d, a, b, x[i+14], 17, -1502002290) b = ff(b, c, d, a, x[i+15], 22, 1236535329) a = gg(a, b, c, d, x[i+ 1], 5 , -165796510)d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632) c = gg(c, d, a, b, x[i+11], 14, 643717713) b = gg(b, c, d, a, x[i+ 0], 20, -373897302) a = gg(a, b, c, d, x[i+ 5], 5 , -701558691) d = gg(d, a, b, c, x[i+10], 9 , 38016083)c = gg(c, d, a, b, x[i+15], 14, -660478335) b = gg(b, c, d, a, x[i+ 4], 20, -405537848) a = gg(a, b, c, d, x[i+ 9], 5 , 568446438)d = gg(d, a, b, c, x[i+14], 9 , -1019803690) c = gg(c, d, a, b, x[i+ 3], 14, -187363961) b = gg(b, c, d, a, x[i+ 8], 20, 1163531501) a = gg(a, b, c, d, x[i+13], 5 , -1444681467) d = gg(d, a, b, c, x[i+ 2], 9 , -51403784)c = gg(c, d, a, b, x[i+ 7], 14, 1735328473) b = gg(b, c, d, a, x[i+12], 20, -1926607734) a = hh(a, b, c, d, x[i+ 5], 4 , -378558)d = hh(d, a, b, c, x[i+ 8], 11, -2022574463) c = hh(c, d, a, b, x[i+11], 16, 1839030562) b = hh(b, c, d, a, x[i+14], 23, -35309556) a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060) d = hh(d, a, b, c, x[i+ 4], 11, 1272893353) c = hh(c, d, a, b, x[i+ 7], 16, -155497632) b = hh(b, c, d, a, x[i+10], 23, -1094730640) a = hh(a, b, c, d, x[i+13], 4 , 681279174) d = hh(d, a, b, c, x[i+ 0], 11, -358537222) c = hh(c, d, a, b, x[i+ 3], 16, -722521979) b = hh(b, c, d, a, x[i+ 6], 23, 76029189)a = hh(a, b, c, d, x[i+ 9], 4 , -640364487) d = hh(d, a, b, c, x[i+12], 11, -421815835) c = hh(c, d, a, b, x[i+15], 16, 530742520)b = hh(b, c, d, a, x[i+ 2], 23, -995338651) a = ii(a, b, c, d, x[i+ 0], 6 , -198630844)d = ii(d, a, b, c, x[i+ 7], 10, 1126891415) c = ii(c, d, a, b, x[i+14], 15, -1416354905) b = ii(b, c, d, a, x[i+ 5], 21, -57434055)a = ii(a, b, c, d, x[i+12], 6 , 1700485571) d = ii(d, a, b, c, x[i+ 3], 10, -1894986606) c = ii(c, d, a, b, x[i+10], 15, -1051523)b = ii(b, c, d, a, x[i+ 1], 21, -2054922799) a = ii(a, b, c, d, x[i+ 8], 6 , 1873313359) d = ii(d, a, b, c, x[i+15], 10, -30611744)c = ii(c, d, a, b, x[i+ 6], 15, -1560198380) b = ii(b, c, d, a, x[i+13], 21, 1309151649) a = ii(a, b, c, d, x[i+ 4], 6 , -145523070)d = ii(d, a, b, c, x[i+11], 10, -1120210379) c = ii(c, d, a, b, x[i+ 2], 15, 718787259)b = ii(b, c, d, a, x[i+ 9], 21, -343485551)a = safe_add(a, olda)b = safe_add(b, oldb)c = safe_add(c, oldc)d = safe_add(d, oldd)}return [a, b, c, d]}/** Convert an array of little-endian words to a hex string.*/function binl2hex(binarray){var hex_tab = "0123456789abcdef"var str = ""for(var i = 0; i < binarray.length * 4; i++){str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +hex_tab.charAt((binarray[i>>2] >> ((i%4)*8)) & 0xF)}return str}/** Convert an array of little-endian words to a base64 encoded string.*/function binl2b64(binarray){var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" var str = ""for(var i = 0; i < binarray.length * 32; i += 6){str += tab.charAt(((binarray[i>>5] << (i%32)) & 0x3F) |((binarray[i>>5+1] >> (32-i%32)) & 0x3F))}return str}/** Convert an 8-bit character string to a sequence of 16-word blocks, stored* as an array, and append appropriate padding for MD4/5 calculation.* If any of the characters are >255, the high byte is silently ignored.*/function str2binl(str){var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocksvar blks = new Array(nblk * 16)for(var i = 0; i < nblk * 16; i++) blks[i] = 0for(var i = 0; i < str.length; i++)blks[i>>2] |= (str.charCodeAt(i) & 0xFF) << ((i%4) * 8)blks[i>>2] |= 0x80 << ((i%4) * 8)blks[nblk*16-2] = str.length * 8return blks}/** Convert a wide-character string to a sequence of 16-word blocks, stored as* an array, and append appropriate padding for MD4/5 calculation.*/function strw2binl(str){var nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocksvar blks = new Array(nblk * 16)for(var i = 0; i < nblk * 16; i++) blks[i] = 0for(var i = 0; i < str.length; i++)blks[i>>1] |= str.charCodeAt(i) << ((i%2) * 16)blks[i>>1] |= 0x80 << ((i%2) * 16)blks[nblk*16-2] = str.length * 16return blks}/** External interface*/function hexMD5 (str) { return binl2hex(coreMD5( str2binl(str))) }function hexMD5w(str) { return binl2hex(coreMD5(strw2binl(str))) }function b64MD5 (str) { return binl2b64(coreMD5( str2binl(str))) }function b64MD5w(str) { return binl2b64(coreMD5(strw2binl(str))) }/* Backward compatibility */function calcMD5(str) { return binl2hex(coreMD5( str2binl(str))) }md5.html页⾯程序如下:<html><head><script language='javascript' src='md5.js'></script><!--引⼊MD5加密--><script language="javascript"><!--function my_do()//通过js对数据进⾏加密{//var URL="http://127.0.0.1/index.jsp?";//var dqz_out="";var dqz_in=document.my_form1.my_in_1.value;document.my_form1.my_out_1.value=hexMD5(dqz_in);document.my_form1.my_out_2.value=hexMD5w(dqz_in);document.my_form1.my_out_3.value=b64MD5(dqz_in);document.my_form1.my_out_4.value=b64MD5w(dqz_in);//URL=URL+"in="+dqz_in+"&out="+dqz_out;//my_form1.action = URL;//window.open(URL,'','');//my_form1.submit();}//--></script></head><body><form name="my_form1" method="get" action=""><p>计算MD5加密结果的例⼦<br>请输⼊加密内容:<textarea name="my_in_1" cols="70" rows="10">1234567890</textarea><br>点击右边的⽂本框显⽰结果:<br><!--mouseup某个⿏标按键被松开,mouseout⿏标从某个元素移开-->hexMD5()= <input name="my_out_1" type="text" onChange="my_do()" onMouseUp="my_do()" onMouseOut="my_do()" size="50" maxlength="50"><br> hexMD5w()=<input name="my_out_2" type="text" onChange="my_do()" onMouseUp="my_do()" onMouseOut="my_do()" size="50" maxlength="50"><br> b64MD5()= <input name="my_out_3" type="text" onChange="my_do()" onMouseUp="my_do()" onMouseOut="my_do()" size="50" maxlength="50"><br> b64MD5w()=<input name="my_out_4" type="text" onChange="my_do()" onMouseUp="my_do()" onMouseOut="my_do()" size="50" maxlength="50"><br> <br></p></form></body></html>md5.js加密效果如图:下⾯介绍微信⼩程序如何加密——模块化我们可以将⼀些公共的代码抽离成为⼀个单独的 js ⽂件,作为⼀个模块。
MD5算法步骤详解转⾃之前要写⼀个MD5程序,但是从⽹络上看到的资料基本上⼀样,只是讲了⼀个⼤概。
经过我⾃⼰的实践,我决定写⼀个⼼得,给需要实现MD5,但⼜不要求很⾼深的编程知识的童鞋参考。
不多说了,直接进⼊正题。
MD5算法是什么,MD5的历史由来等等我都不介绍了,想要了解的童鞋直接百度吧,见谅~~我们直接讲算法步骤。
我的事例是对⼀个字符串进⾏MD5加密,没有实现对⽂件的MD5加密,⼤家看了这个事例之后应该⾃⼰能抛砖引⽟了。
如果想参考完整代码,可以进此查看:/wjl15989/article/details/8606997步骤1:我们是对⼀个字符串进⾏MD5加密,所以我们先从字符串的处理开始。
⾸先我们要知道⼀个字符的长度是8位(bit),即⼀个字节的长度。
现在我们要做的就是将⼀个字符串Str1分割成每512位为⼀个分组,形如N*512+R,最后多出来的不⾜512位的R部分先填充⼀个1,再接⽆数个0,直到补⾜512位。
这⾥要注意,R为0时也要补位,这时候补512位,最⾼位1,形如1000…00;如果R超出448,除了要补满这个分组外,还要再补上⼀个512位的分组(因为超过448位则不能留64位出来存放字符串的原长)。
接着,讲讲将字符串分块保存部分。
⼀个512位的字符串分组要分成16个32位的⼦分组,在每个32位中,以字节为单位通过⼩端规则存⼊⼀个32位的变量中,可以考虑⽤int类型的变量(⼀个int变量32位),也可以考虑⽤unsigned int,这样之后涉及的循环移位就不⽤考虑符号位了,这⾥还是以int为例。
因为⼀个字符就是⼀个字节(8位),所以⼀个int类型变量能存放4个字符,假设⼀个字符串abcd,那么存在⼀个int类型变量中就是cdab。
因此这⾥我们将字符串每4个字符分成⼀块,每⼀个块都以⼩端规则存放在⼀个int类型的变量中。
估计有的⼈不清楚⼩端规则(Little-Endian),可以上⽹查,这⾥就不详细说了,见谅~补充好后的Str2长度为(N+1)*512位(如果R超出448,则是(N+2)*512),此时最低的64位预留,⽤来存放之前str1的长度length(长度为字符个数*8 bit)的值,如果这个length值的⼆进制位数⼤于64位,则只保留最低的64位。
什么是MD5码?怎样校验MD5码?2008-02-06 01:22下载WinMD5校验器为了确保您所下载的文件是完整和安全可靠的,我们建议您使用MD5校验,这里将介绍什么是MD5校验和如何使用MD5工具进行校验。
什么是MD5码?MD5码是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的“数字指纹”。
任何一个文件,无论是可执行程序、图像文件、临时文件或者其他任何类型的文件,也不管它体积多大,都有且只有一个独一无二的MD5信息码,并且如果这个文件被修改过,它的MD5码也将随之改变。
MD5码有什么用?我们可以通过对比同一文件的MD5码,来校验这个文件是否被“篡改”过。
当我们下载了文件后,如果想知道下载的这个文件和官方网站的原始文件是否一模一样,就可以给自己下载的文件做个MD5码校验。
MD5码如何使用?1、下载官方提供的MD5码校验工具下载WinMD5校验器2、运行MD5码校验工具如WinMD5、MD5Check.exe 等3、将要检查的文件拖动到窗口内,选择计算等待生成MD5码4、检查生成的MD5码是否与官方网站提供的相同5、如果得到的MD5码和官方网站公布的相同,可确认所下载的文件是完整且正确的。
6、如果MD5码和官方网站公布的不同,说明你下载的文件不完整或在网络下载的过程中出现错误,请您重新下载;也有可能该文件已被别人修改,为防止他人更改该文件时放入病毒或木马,请不要使用该客户端。
又文:什么是MD5?怎样用MD5来校验下载的iso镜像文件?一、什么是MD5?MD5 是一种加密技术,其典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。
举个例子,警察可以根据指纹来指认犯罪嫌疑人,那么,我们就可以根据文件的MD5 值来验证文件是否原始文件,以防止被篡改、加入木马、病毒等。
(关于MD5 的有关情况请参阅汉化包中的“MD5简介.txt” 文档)WinMD5 则是校验文件的MD5 值的一个小程序。
MD5加密和⼿机号登录
参考:
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm)⼀种被⼴泛使⽤的密码散列函数,可以产⽣出⼀个128位(16字节)的散列值(hash value),⽤于确保信息传输完整⼀致。
MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计
md5理论上128个字节可以对应n多个信息,所以理论上不可以破解,输⼊任意字符串,得到不同的结果,根据128位的输⼊信息不可能得到密⽂,⽐如⼀个字符串映射成128bit的整数,理论上有2*128种可能
但是在实际的过程:
可以通过⽤户暴⼒⽣成各种字符串进⾏组合然后进⾏hash,很多⽤户的密码不够复杂,所以很容易被这种⽅法⽣成出来,防范这种⽅式的办法主要是⼀个随机salt,只要salt够长,会带来⿇烦,
还有种⽅式就是彩虹表和字典,通过数据库把常见字符转换为MD5存储为彩虹表,然后直接反查询,两种⽅法得到字典,⼀种是⽇常搜集的⽤做密码的字符串表,另⼀种是⽤排列组合⽅法⽣成的.通过⼤量例⼦发现某密⽂中A对应C,然后我会记在数据字典中,下次直接⽤C代替A,看上去好像了破解了,实则并没有破解,只是找到了规律适应这种密⽂⽽已。
MD5进⾏了加密之后不可以逆转
将密盐存储在redis⾥⾯,⽅式为 StringRedisTemplate<salt:md5(SECRET+tell),salt>,获取的时候先get密盐, tele+miyan得到数据
> 后续更新很少见到这种要求如果遇到赶紧跑因为⼿机号需要做索引的。
什么是MD51.什么是MD5 :MD5 就是 Message(消息,信息) digest(消化,摘要) algorithm(运算法则) 翻译成普通话就是信息摘要算法。
在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来2.md5是怎样进行加密的这个要分步来讲为了更好的明白我们来举个例子来讲如对一个字符串 "string" 进行加密第一步我们要把他转换成位(MD5是对位进行操作),现在假设 string 转换为位后是1010000101110101,接下来就要对这个字节串进行补位成比512的倍数(n倍)位少64位就成,补位的规则嘛就是在你的位后先补一个1 其它的补0 就成,那么补位后这个串变成 10100000101110101 1(先补的那个1)0000...000(总共512-64位)这些完成后还要在其后面补上一个64位的数据当然这个数据也是有规定的,这个数据就是原字节串的长度(当然这个长度已被转换成了64位。
至此,数据补完后这串正好是512的倍数 512 * N-64+64至此,前两步补位和补数据长度完成了,在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。
算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。
填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。
这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
四个32位变量初始化为:A=0x01234567B=0x89abcdefC=0xfedcba98D=0x76543210它们称为链接变量(chaining variable)接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
哈希算法简单举例哈希算法是一种常用的密码学算法,用于将任意长度的数据映射为固定长度的哈希值。
它的核心思想是通过一系列数学运算和逻辑操作,将输入数据转换为一个唯一的哈希值。
这个哈希值可以用于数据的完整性检查、身份验证、密码存储和查找等应用。
下面是一些常见的哈希算法和它们的简单举例。
1. MD5(Message Digest Algorithm 5)MD5是最常见的哈希算法之一,在许多领域中被广泛应用。
它将任意长度的输入数据(如文件、文本、密码等)转换为一个128位的哈希值。
MD5算法是不可逆的,即无法通过哈希值逆推出原始数据。
举个例子,"Hello World"经过MD5算法得到的哈希值为5eb63bbbe01eeed093cb22bb8f5acdc32. SHA-1(Secure Hash Algorithm 1)3. SHA-256(Secure Hash Algorithm 256-bit)4. CRC32(Cyclic Redundancy Check)CRC32是一种简单的哈希算法,常用于数据校验。
它将输入数据转换为一个32位的哈希值,用于验证数据的完整性。
CRC32算法是不可逆的,且在文件传输和网络通信中得到广泛应用。
举个例子,"Hello World"经过CRC32算法得到的哈希值为65a0c6da。
5. bcrypt(Blowfish Crypt Hashing Algorithm)bcrypt是一种专门用于密码存储的哈希算法,通过多次的哈希迭代来增加密码被破解的难度。
它将用户的密码转换为一个固定长度的哈希值,同时适用于密码的验证。
bcrypt算法是不可逆的,并且在密码学安全性方面较为可靠。
总结起来,哈希算法是一种重要的密码学工具,通过将任意长度的输入数据转换为固定长度的哈希值,可以实现数据的完整性验证、密码存储和查找等应用。
从MD5、SHA-1到更安全的SHA-256和bcrypt,不同的哈希算法有不同的特点和应用场景。
哈希算法 matlab哈希算法(Hash Algorithm)是一种将任意长度的数据映射为固定长度值的算法。
在计算机科学领域中,哈希函数被广泛应用于数据的完整性验证、密码学中的数字签名、散列表等各种场景。
而在Matlab中,我们也可以通过使用Matlab内置的哈希函数实现对数据的哈希运算。
Matlab中有两个常用的哈希函数,分别是`DataHash`和`md5`。
下面我们将分别对这两个函数进行介绍,并提供一些示例代码进行参考。
## 1. DataHash函数`DataHash`函数是Matlab中用于计算数据哈希值的函数。
它支持多种哈希算法,比如MD5、SHA-1、SHA-256等,可以通过指定参数选择不同的算法。
下面是一个使用DataHash函数计算MD5哈希值的例子:```matlabdata = 'Hello World!';hash = DataHash(data, 'MD5');disp(hash);```运行上述代码,将会输出`ed076287532e86365e841e92bfc50d8c`,这就是字符串`Hello World!`的MD5哈希值。
除了可以对字符串进行哈希计算,DataHash函数还支持对数值、矩阵、结构等数据进行哈希运算。
同时,我们还可以通过指定参数来控制哈希算法的选择和参数设置。
更详细的使用说明可以参考Matlab的官方文档。
## 2. md5函数`md5`函数是Matlab中另一个常用的哈希函数,用于计算给定数据的MD5哈希值。
与DataHash函数不同,md5函数仅支持计算MD5哈希值。
下面是一个使用md5函数计算MD5哈希值的例子:```matlabdata = 'Hello World!';hash = md5(data);disp(hash);```运行上述代码,得到的输出与DataHash函数的例子相同,也是字符串`Hello World!`的MD5哈希值`ed076287532e86365e841e92bfc50d8c`。
MD5算法详解前⾯⼀篇,带⼤家对加密算法进⾏了鸟瞰,本篇主要谈md5算法的实现。
MD5:Message-Digest Algorithm 5(信息摘要5),确保信息的完整性。
其算法是1992年公开的,那时我才⼏岁,鉴于⼤家对md5都很熟悉,且程序中经常应⽤,我就不再介绍了。
我简单的介绍下设计者。
其⼈是罗纳德·李维斯特,美国密码学家,后来发明了⾮对称秘钥RSA 算法,因这个算法的在信息安全中的突破与重要性⽽获得了2002年的图灵奖。
好了,接下来⼀起看算法步骤以及源代码:1、填充在MD5算法中,⾸先需要对信息进⾏填充,使其位长对512求余的结果等于448,并且填充必须进⾏,使其位长对512求余的结果等于448。
因此,信息的位长(Bits Length)将被扩展⾄N*512+448,N为⼀个⾮负整数,N可以是零。
理解:位长,就是位数。
⽐如⼀个“wbq”,字符串是三个字节存储,⼀个字节8bit,所以位长就是24。
⽤数学语⾔可能更简洁:设M为位长,当且仅当 M%512==448时,才可以处理。
换另⼀种表⽰⽅式,M=N*512+448 ,N>=0填充的⽅法如下:1) 在信息的后⾯填充⼀个1和⽆数个0,直到满⾜上⾯的条件时才停⽌⽤0对信息的填充。
2) 在这个结果后⾯附加⼀个以64位⼆进制表⽰的填充前信息长度(单位为Bit),如果⼆进制表⽰的填充前信息长度超过64位,则取低64位。
经过这两步的处理,M=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。
这样做的原因是为满⾜后⾯处理中对信息长度的要求。
经过两步处理后,信息变成了这样,如下图所⽰:64位,8个字节,⽤来表⽰原始信息的位长。
1private static UInt32[] MD5_Append(byte[] input)2 {3int zeros = 0;4int ones = 1;5int size = 0;6int n = input.Length;7int m = n % 64;8if (m < 56)9 {10 zeros = 55 - m;11 size = n - m + 64;12 }13else if (m == 56)14 {15 zeros = 0;16 ones = 0;17 size = n + 8;18 }19else20 {21 zeros = 63 - m + 56;22 size = n + 64 - m + 64;23 }2425 ArrayList bs = new ArrayList(input);26if (ones == 1)27 {28 bs.Add((byte)0x80); // 0x80 = $1000000029 }30for (int i = 0; i < zeros; i++)31 {32 bs.Add((byte)0);33 }3435 UInt64 N = (UInt64)n * 8;36byte h1 = (byte)(N & 0xFF);37byte h2 = (byte)((N >> 8) & 0xFF);3839byte h3 = (byte)((N >> 16) & 0xFF);40byte h4 = (byte)((N >> 24) & 0xFF);41byte h5 = (byte)((N >> 32) & 0xFF);42byte h6 = (byte)((N >> 40) & 0xFF);43byte h7 = (byte)((N >> 48) & 0xFF);44byte h8 = (byte)(N >> 56);45 bs.Add(h1);46 bs.Add(h2);47 bs.Add(h3);48 bs.Add(h4);49 bs.Add(h5);50 bs.Add(h6);51 bs.Add(h7);52 bs.Add(h8);53byte[] ts = (byte[])bs.ToArray(typeof(byte));5455/* Decodes input (byte[]) into output (UInt32[]). Assumes len is56 * a multiple of 4.57*/58 UInt32[] output = new UInt32[size / 4];59for (Int64 i = 0, j = 0; i < size; j++, i += 4)60 {61 output[j] = (UInt32)(ts[i] | ts[i + 1] << 8 | ts[i + 2] << 16 | ts[i + 3] << 24);62 }63return output;64 }说明,补多少0,如何补?第7⾏,求余。
MD5简介和不可逆原因,以及攻防⼿段简介MD5是⼀种信息摘要算法,不可反向解密。
不管原⽂是什么,最后得到的密⽂长度都为32个16进制字符,不区分⼤⼩写。
特点是:1、原⽂即使改动很⼩,密⽂就会发⽣巨⼤变化,“⾯⽬全⾮”,毫⽆规律。
2、原⽂长度没有要求,密⽂的长度固定,32个16进制字符。
3、相同的原⽂,⽣成相同的密⽂。
4、不同的原⽂,⼤概率得到不同的密⽂,极⼩概率得到相同的密⽂。
因为密⽂由32个16进制字符组成,可能性组合就是16的32次⽅,密⽂的可能性是有限的,⽽原⽂可能性⽆限多,⽆限对应有限,必定会出现碰撞。
5、原⽂区分⼤⼩写,密⽂不区分⼤⼩写。
原⽂:123456,MD5密⽂:E10ADC3949BA59ABBE56E057F20F883E原⽂:123457,MD5密⽂:F1887D3F9E6EE7A32FE5E76F4AB80D63编码问题在计算MD5时,原⽂会先转换成byte,有可能会产⽣编码问题。
以GB2312和UTF-8编码为例。
特别是中⽂,⽤GB2312和UTF-8编码分别转换成byte,结果不⼀样。
所以在编写代码时,各处使⽤的MD5算法,应该使⽤相同的编码,否则可能导致相同的原⽂,产⽣不同的密⽂。
使⽤MD5是不能进⾏常规的反向解密,使⽤时⼀般⽐较密⽂,如果密⽂⼀样,则认为原⽂⼀样,不需要知道原⽂到底是什么。
虽然存在碰撞的可能性,不同的原⽂,它们的密⽂相同,但是实际使⽤中因为概率低,在⾮极端安全要求的情况下,不考虑这种情况。
使⽤密⽂⽐对,数据库不会保存原⽂。
因为密⽂⽆法反向解密,所以除了⽤户,即使系统管理员也⽆法知道⽤户的密码原⽂。
不可逆原因原因很简单,因为MD5是⼀种摘要算法,所谓摘要,就是会有⼀些信息丢失,⽆法得知丢失的信息,也就⽆法逆运算。
⽐如,120,121,122去掉最后⼀位数字,结果都是12,没有办法知道去掉的到底是什么数字。
暴破既然MD5⽆法逆运算,那为什么⽹上还有MD5破解?其实不是真正意义上的破解。
package mon.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import ng3.StringUtils;
import com.uniproud.crm.base.sys.SysParam;
/**
* MD5测试例子
*
* @author jun
*
*/
public class MD5 {
private static HashMap<String, WebServiceBean> customer_hashMap = new HashMap<String, WebServiceBean>(); // 有效登陆的客户map
public static WebServiceBean getBean(String key) {
if (StringUtils.isBlank(key)) {
return null;
}
if (customer_hashMap.get(key) != null) {
return customer_hashMap.get(key);
}
return null;
}
public static void add(String key, WebServiceBean bean) { customer_hashMap.put(key, bean);
}
public static void remove(String key) {
customer_hashMap.remove(key);
}
/**
* MD5加密处理返回字符串。
*
* @param pw
* @return
*/
public static String getMD5(String pw) {
try {
// 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
// 输入的字符串转换成字节数组
byte[] inputByteArray = pw.getBytes();
// inputByteArray是输入字符串转换得到的字节数组
messageDigest.update(inputByteArray);
// 转换并返回结果,也是字节数组,包含16个元素
byte[] resultByteArray = messageDigest.digest();
// 字符数组转换成字符串返回
return byteArrayToHex(resultByteArray);
} catch (NoSuchAlgorithmException e) {
return null;
}
}
public static String byteArrayToHex(byte[] byteArray) { // 首先初始化一个字符数组,用来存放每个16进制字符
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
// new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
char[] resultCharArray = new char[byteArray.length * 2];
// 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
int index = 0;
for (byte b : byteArray) {
resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
resultCharArray[index++] = hexDigits[b & 0xf];
}
// 字符数组组合成字符串返回
return new String(resultCharArray);
}
/**
* 校验Ip地址是否合法。
*
* @param remoteIp
* webservice 的Ip地址
* @return
*/
public static boolean validIp(String remoteIp) {
if
(SysParam.getSysParamFlag("IsWebServiceNeedVerificationIp") != 1 || remoteIp.trim().equals("")) {// 没启用
return true;
}
String ip = SysParam.getSysParamValue("WebServiceValidIp");
if (ip == null || ip.equals("")) {
System.out.println("请在管理软件中设置Ip地址!");
return false;
}
String[] p = ip.split(";");
boolean flag = false;
for (int i = 0; i < p.length; i++) {
if (p[i].equals(remoteIp)) {
flag = true;
break;
}
}
return flag;
}
public static void main(String args[]) {
System.out.println(getMD5("123456"));
//System.out.println(getMD5("tb"));
}
}。