MD5算法原理及C#和JS实现的方法是什么


本篇内容主要讲解“MD5算法原理及C#和JS实现的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MD5算法原理及C#和JS实现的方法是什么”吧!

一、简介

MD5 是哈希算法(散列算法)的一种应用。Hash 算法虽然被称为算法,但实际上它更像是一种思想。Hash 算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是 Hash 算法。

算法目的就是,把任意长度的输入(又叫做预映射 pre-image),通过散列算法变换成固定长度的输出,该输出就是散列值。

注意,不同的输入可能会散列成相同的输出,所以不能从散列值来确定唯一的输入值。

散列函数简单的说就是:一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

Hash 算法是一个广义的算法,也可以认为是一种思想,使用 Hash 算法可以提高存储空间的利用率,可以提高数据的查询效率,因为很难找到其逆向规律,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。

散列值不同 => 原始值不同

如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果。

散列值相同 ≠> 原始值相同

散列函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但不绝对肯定二者一定相等(可能出现哈希碰撞)。

关于“撞库”(Credential Stuffing Attack)

其在网络安全中是一个古老的概念,按中文的字面意思解读,就是“碰撞数据库”的意思。“碰撞”意味着碰运气,即不一定能成功;而“数据库”中往往存储着大量敏感数据,比如我们登录一个网站所需要的用户名、密码,再比如手机号、身份证号等个人隐私信息。“撞库”在英文中的表述为 Credential Stuffing(密码嗅探),也非常直白的说明了撞库的主要场景:试图获取正确的账号/密码组合,大白话就是“盗号”。

二、C# 代码实现

根据传入参数,返回分大小写的 16 位或 32 位密文,并且可自定义编码规则。

//测试stringjiamihou16=SecurityMD5.MD5Encrypt("TestString",16,false);//8828701f97fa4511stringjiamihou32=SecurityMD5.MD5Encrypt("TestString",32);//5B56F40F8828701F97FA4511DDCD25FB///<summary>///MD5加密方法///</summary>///<paramname="md5instr">待加密字符串</param>///<paramname="digit">位数:16/32/64</param>///<paramname="isupper">输出大小写:true大写;false小写(返回为64位时不区分大小写)</param>///<paramname="encoding">字符编码规则,为空默认:UTF8</param>///<returns></returns>publicstaticstringMD5Encrypt(stringmd5instr,intdigit,boolisupper=true,Encodingencoding=null){stringmd5outstr=string.Empty;if(encoding==null)encoding=Encoding.UTF8;switch(digit){case16://SecurityMD5.MD5Encrypt(md5instr,16,true);//16位大写//SecurityMD5.MD5Encrypt(md5instr,16,false);//16位小写varmd5provider=newMD5CryptoServiceProvider();varhashinstr16=md5providerputeHash(encoding.GetBytes(md5instr));md5outstr=BitConverter.ToString(hashinstr16,4,8);md5outstr=md5outstr.Replace("-","");if(!isupper)md5outstr=md5outstr.ToLower();returnmd5outstr;case32://SecurityMD5.MD5Encrypt(md5instr,32,true);//32位大写//SecurityMD5.MD5Encrypt(md5instr,32,false);//32位小写MD5md532=MD5.Create();byte[]hashinstr32=md532puteHash(encoding.GetBytes(md5instr));stringupperorlowerflag=isupper?"X2":"x2";for(inti=0;i<hashinstr32.Length;i++){md5outstr=md5outstr+hashinstr32[i].ToString(upperorlowerflag);}returnmd5outstr;case64://SecurityMD5.MD5Encrypt(md5instr,64);//64位加密,加密后为24位的值,例如:9GnLVZEzFmZLMj963TqUEQ==MD5md564=MD5.Create();byte[]hashinstr64=md564puteHash(encoding.GetBytes(md5instr));returnConvert.ToBase64String(hashinstr64);default:return"";}}

三、js 代码实现

根据传入参数,返回分大小写的 16 位或 32 位密文。

//测试md5_function("TestString",16,false)>'8828701f97fa4511'md5_function("TestString",32,true)>'5B56F40F8828701F97FA4511DDCD25FB'//MD5加密(入参分别是:待加密内容、返回位数、是否为大写)functionmd5_function(md5instr,digit,isupper){functionmd5_RotateLeft(lValue,iShiftBits){return(lValue<<iShiftBits)|(lValue>>>(32-iShiftBits));}functionmd5_AddUnsigned(lX,lY){varlX4,lY4,lX8,lY8,lResult;lX8=(lX&0x80000000);lY8=(lY&0x80000000);lX4=(lX&0x40000000);lY4=(lY&0x40000000);lResult=(lX&0x3FFFFFFF)+(lY&0x3FFFFFFF);if(lX4&lY4){return(lResult^0x80000000^lX8^lY8);}if(lX4|lY4){if(lResult&0x40000000){return(lResult^0xC0000000^lX8^lY8);}else{return(lResult^0x40000000^lX8^lY8);}}else{return(lResult^lX8^lY8);}}functionmd5_F(x,y,z){return(x&y)|((~x)&z);}functionmd5_G(x,y,z){return(x&z)|(y&(~z));}functionmd5_H(x,y,z){return(x^y^z);}functionmd5_I(x,y,z){return(y^(x|(~z)));}functionmd5_FF(a,b,c,d,x,s,ac){a=md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_F(b,c,d),x),ac));returnmd5_AddUnsigned(md5_RotateLeft(a,s),b);};functionmd5_GG(a,b,c,d,x,s,ac){a=md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_G(b,c,d),x),ac));returnmd5_AddUnsigned(md5_RotateLeft(a,s),b);};functionmd5_HH(a,b,c,d,x,s,ac){a=md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_H(b,c,d),x),ac));returnmd5_AddUnsigned(md5_RotateLeft(a,s),b);};functionmd5_II(a,b,c,d,x,s,ac){a=md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_I(b,c,d),x),ac));returnmd5_AddUnsigned(md5_RotateLeft(a,s),b);};functionmd5_ConvertToWordArray(md5instr){varlWordCount;varlMessageLength=md5instr.length;varlNumberOfWords_temp1=lMessageLength+8;varlNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1%64))/64;varlNumberOfWords=(lNumberOfWords_temp2+1)*16;varlWordArray=Array(lNumberOfWords-1);varlBytePosition=0;varlByteCount=0;while(lByteCount<lMessageLength){lWordCount=(lByteCount-(lByteCount%4))/4;lBytePosition=(lByteCount%4)*8;lWordArray[lWordCount]=(lWordArray[lWordCount]|(md5instr.charCodeAt(lByteCount)<<lBytePosition));lByteCount++;}lWordCount=(lByteCount-(lByteCount%4))/4;lBytePosition=(lByteCount%4)*8;lWordArray[lWordCount]=lWordArray[lWordCount]|(0x80<<lBytePosition);lWordArray[lNumberOfWords-2]=lMessageLength<<3;lWordArray[lNumberOfWords-1]=lMessageLength>>>29;returnlWordArray;};functionmd5_WordToHex(lValue){varWordToHexValue="",WordToHexValue_temp="",lByte,lCount;for(lCount=0;lCount<=3;lCount++){lByte=(lValue>>>(lCount*8))&255;WordToHexValue_temp="0"+lByte.toString(16);WordToHexValue=WordToHexValue+WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);}returnWordToHexValue;};functionmd5_Utf8Encode(md5instr){md5instr=md5instr?.replace(/\r\n/g,"\n");varutftext="";for(varn=0;n<md5instr.length;n++){varc=md5instr.charCodeAt(n);if(c<128){utftext+=String.fromCharCode(c);}elseif((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);}}returnutftext;};varx=Array();vark,AA,BB,CC,DD,a,b,c,d;varS11=7,S12=12,S13=17,S14=22;varS21=5,S22=9,S23=14,S24=20;varS31=4,S32=11,S33=16,S34=23;varS41=6,S42=10,S43=15,S44=21;md5instr=md5_Utf8Encode(md5instr);x=md5_ConvertToWordArray(md5instr);a=0x67452301;b=0xEFCDAB89;c=0x98BADCFE;d=0x10325476;for(k=0;k<x.length;k+=16){AA=a;BB=b;CC=c;DD=d;a=md5_FF(a,b,c,d,x[k+0],S11,0xD76AA478);d=md5_FF(d,a,b,c,x[k+1],S12,0xE8C7B756);c=md5_FF(c,d,a,b,x[k+2],S13,0x242070DB);b=md5_FF(b,c,d,a,x[k+3],S14,0xC1BDCEEE);a=md5_FF(a,b,c,d,x[k+4],S11,0xF57C0FAF);d=md5_FF(d,a,b,c,x[k+5],S12,0x4787C62A);c=md5_FF(c,d,a,b,x[k+6],S13,0xA8304613);b=md5_FF(b,c,d,a,x[k+7],S14,0xFD469501);a=md5_FF(a,b,c,d,x[k+8],S11,0x698098D8);d=md5_FF(d,a,b,c,x[k+9],S12,0x8B44F7AF);c=md5_FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);b=md5_FF(b,c,d,a,x[k+11],S14,0x895CD7BE);a=md5_FF(a,b,c,d,x[k+12],S11,0x6B901122);d=md5_FF(d,a,b,c,x[k+13],S12,0xFD987193);c=md5_FF(c,d,a,b,x[k+14],S13,0xA679438E);b=md5_FF(b,c,d,a,x[k+15],S14,0x49B40821);a=md5_GG(a,b,c,d,x[k+1],S21,0xF61E2562);d=md5_GG(d,a,b,c,x[k+6],S22,0xC040B340);c=md5_GG(c,d,a,b,x[k+11],S23,0x265E5A51);b=md5_GG(b,c,d,a,x[k+0],S24,0xE9B6C7AA);a=md5_GG(a,b,c,d,x[k+5],S21,0xD62F105D);d=md5_GG(d,a,b,c,x[k+10],S22,0x2441453);c=md5_GG(c,d,a,b,x[k+15],S23,0xD8A1E681);b=md5_GG(b,c,d,a,x[k+4],S24,0xE7D3FBC8);a=md5_GG(a,b,c,d,x[k+9],S21,0x21E1CDE6);d=md5_GG(d,a,b,c,x[k+14],S22,0xC33707D6);c=md5_GG(c,d,a,b,x[k+3],S23,0xF4D50D87);b=md5_GG(b,c,d,a,x[k+8],S24,0x455A14ED);a=md5_GG(a,b,c,d,x[k+13],S21,0xA9E3E905);d=md5_GG(d,a,b,c,x[k+2],S22,0xFCEFA3F8);c=md5_GG(c,d,a,b,x[k+7],S23,0x676F02D9);b=md5_GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);a=md5_HH(a,b,c,d,x[k+5],S31,0xFFFA3942);d=md5_HH(d,a,b,c,x[k+8],S32,0x8771F681);c=md5_HH(c,d,a,b,x[k+11],S33,0x6D9D6122);b=md5_HH(b,c,d,a,x[k+14],S34,0xFDE5380C);a=md5_HH(a,b,c,d,x[k+1],S31,0xA4BEEA44);d=md5_HH(d,a,b,c,x[k+4],S32,0x4BDECFA9);c=md5_HH(c,d,a,b,x[k+7],S33,0xF6BB4B60);b=md5_HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);a=md5_HH(a,b,c,d,x[k+13],S31,0x289B7EC6);d=md5_HH(d,a,b,c,x[k+0],S32,0xEAA127FA);c=md5_HH(c,d,a,b,x[k+3],S33,0xD4EF3085);b=md5_HH(b,c,d,a,x[k+6],S34,0x4881D05);a=md5_HH(a,b,c,d,x[k+9],S31,0xD9D4D039);d=md5_HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);c=md5_HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);b=md5_HH(b,c,d,a,x[k+2],S34,0xC4AC5665);a=md5_II(a,b,c,d,x[k+0],S41,0xF4292244);d=md5_II(d,a,b,c,x[k+7],S42,0x432AFF97);c=md5_II(c,d,a,b,x[k+14],S43,0xAB9423A7);b=md5_II(b,c,d,a,x[k+5],S44,0xFC93A039);a=md5_II(a,b,c,d,x[k+12],S41,0x655B59C3);d=md5_II(d,a,b,c,x[k+3],S42,0x8F0CCC92);c=md5_II(c,d,a,b,x[k+10],S43,0xFFEFF47D);b=md5_II(b,c,d,a,x[k+1],S44,0x85845DD1);a=md5_II(a,b,c,d,x[k+8],S41,0x6FA87E4F);d=md5_II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);c=md5_II(c,d,a,b,x[k+6],S43,0xA3014314);b=md5_II(b,c,d,a,x[k+13],S44,0x4E0811A1);a=md5_II(a,b,c,d,x[k+4],S41,0xF7537E82);d=md5_II(d,a,b,c,x[k+11],S42,0xBD3AF235);c=md5_II(c,d,a,b,x[k+2],S43,0x2AD7D2BB);b=md5_II(b,c,d,a,x[k+9],S44,0xEB86D391);a=md5_AddUnsigned(a,AA);b=md5_AddUnsigned(b,BB);c=md5_AddUnsigned(c,CC);d=md5_AddUnsigned(d,DD);}if(digit==16){if(isupper)return(md5_WordToHex(b)+md5_WordToHex(c)).toUpperCase();elsereturn(md5_WordToHex(b)+md5_WordToHex(c)).toLowerCase();}elseif(digit==32){if(isupper)return(md5_WordToHex(a)+md5_WordToHex(b)+md5_WordToHex(c)+md5_WordToHex(d)).toUpperCase();elsereturn(md5_WordToHex(a)+md5_WordToHex(b)+md5_WordToHex(c)+md5_WordToHex(d)).toLowerCase();}return"";}

到此,相信大家对“MD5算法原理及C#和JS实现的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是主机评测网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


上一篇:ChatGPT在前端领域怎么应用

下一篇:docker安装mongoDB及使用方法是什么


Copyright © 2002-2019 测速网 https://www.inhv.cn/ 皖ICP备2023010105号 城市 地区 街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!
热门搜索