MD5算法最基本的原理就是一个方程的解的原理!假设给定一个方程f(x),通过对自变量x的赋值,可以得到因变量f(x)的值(举个例子f(x)=2x+1,令x=1,则f(x)=3)!小学的解方程,就是这个的逆运用!从理论上来说,一直f(x)的表达式,以及f(x)的值,完全可以解出x(比如f(x)=2x+1,f(x)=3,则通过解一个一元一次方程,可以得出x=1)!但是,实际上,并不是每个方程都能得到准确解得!比如f(x)是一个指数函数,我们只能解出对数,得不出准确的实数解,这时,我们就是这个函数的求解是困难的!MD5的基本原理就是这样,MD5是用来进行身份认证而设计的,因此,我们不需要MD5能够通过密文得出明文!因此,MD5从理论上来说还是不可以逆解的!但是,事实上,王小云博士已经发现了破解办法——差分攻击,但是此办法需要满足290个充要条件,经过王小云博士的研究,已经减少到70个充要条件!但仍是天文数字!现在网上流传的破解,从本质上来说,都是“暴力破解”,也就所有加密算法都通用的!这个办法,很慢,而且完全是看概率的!
对于MD5就先讲这么多,想知道具体的算法流程,请加我
MD5是一种单向的加密算法,本身会丢失原始信息,并不能用于数据传输的加解密,在网络通信中却有一席之地,如 微信支付 中用于签名算法。
无论输入数据大小,输出总是128位的信息,一般用16进制显示。
这个概率有多小,形象的描述是“比连续中500万年500万大奖的概率还小”,相当于几十亿台电脑中有几十亿个文件,才有可能相同,一般的数据表完全不用考虑这个问题。
MD5是单向算法,无法获得原始值,但现在有解密平台保留了很多常见值的加密值,当量到一定范围时,相当于可以从MD5查询出原值。
利用MD5的特性2和3,在网络传输中,将接收到的数据做MD5运算,如果MD5值不匹配,则认为数据被篡改。
利用MD5的稳定性和分散性,可以在数组结构中获得一张“平衡”的表,以加快查找数据的速度。
调用
MD5算法只是哈希算法中的一种,常见的还有 MD4,SHA-0, SHA-1,SHA-2。在安全要求更高的场景中,推荐SHA-2算法。
MD5不是加密算法,它是Hash算法,所以它不可逆,也没法还原成原文。
你可以用base64、异或或者aes des等加密算法去实现。
1、base64加密
在页面中引入base64.js文件,调用方法为:
?
123456789101112131415161718
!DOCTYPE HTMLhtmlheadmeta charset="utf-8"titlebase64加密/titlescript type="text/javascript" src="base64.js"/scriptscript type="text/javascript" var b = new Base64(); var str = b.encode("admin:admin"); alert("base64 encode:" + str);//解密 str = b.decode(str); alert("base64 decode:" + str);/script/headbody/body/html
2、md5加密
在页面中引用md5.js文件,调用方法为
?
1234567891011121314
!DOCTYPE HTMLhtmlheadmeta charset="utf-8"titlemd5加密/titlescript type="text/ecmascript" src="md5.js"/scriptscript type="text/javascript" var hash = hex_md5("123dafd"); alert(hash)/script/headbody/body/html
3、sha1加密
据说这是最安全的加密
页面中引入sha1.js,调用方法为
?
1234567891011121314
!DOCTYPE HTMLhtmlheadmeta charset="utf-8"titlesha1加密/titlescript type="text/ecmascript" src="sha1.js"/scriptscript type="text/javascript" var sha = hex_sha1('mima123465') alert(sha)/script/headbody/body/html
一下为js们的源代码
base64.js:
?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
/**** Base64 encode / decode** @author haitao.tu* @date 2010-04-26* @email tuhaitao@foxmail.com**/function Base64() { // private property _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; // public method for encoding this.encode = function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = _utf8_encode(input); while (i input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 2; enc2 = ((chr1 3) 4) | (chr2 4); enc3 = ((chr2 15) 2) | (chr3 6); enc4 = chr3 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); } return output; } // public method for decoding this.decode = function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i input.length) { enc1 = _keyStr.indexOf(input.charAt(i++)); enc2 = _keyStr.indexOf(input.charAt(i++)); enc3 = _keyStr.indexOf(input.charAt(i++)); enc4 = _keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 2) | (enc2 4); chr2 = ((enc2 15) 4) | (enc3 2); chr3 = ((enc3 3) 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = _utf8_decode(output); return output; } // private method for UTF-8 encoding _utf8_encode = function (string) { string = string.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n string.length; n++) { var c = string.charCodeAt(n); if (c 128) { utftext += String.fromCharCode(c); } else if((c 127) (c 2048)) { utftext += String.fromCharCode((c 6) | 192); utftext += String.fromCharCode((c 63) | 128); } else { utftext += String.fromCharCode((c 12) | 224); utftext += String.fromCharCode(((c 6) 63) | 128); utftext += String.fromCharCode((c 63) | 128); } } return utftext; } // private method for UTF-8 decoding _utf8_decode = function (utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while ( i utftext.length ) { c = utftext.charCodeAt(i); if (c 128) { string += String.fromCharCode(c); i++; } else if((c 191) (c 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c 31) 6) | (c2 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c 15) 12) | ((c2 63) 6) | (c3 63)); i += 3; } } return string; }}
校验算法, 因为是通过 hash 实现的, 所以丢失了信息,单向的函数,不能恢复到原来的值,加密能解密的。