-
-
[原创]关于某网站登录请求的分析并解密登录密码
-
发表于: 2022-5-27 17:26 613
-
以下是用户登录密码的加密脚本(在点击登录按钮后,该脚本是从服务器请求回来的,并加密当前用户密码,再将登录名和加密后的密码发送给服务器)
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 | function encrypt(g, d) { / / g为用户输入的密码,d为session 的值 var e = string2Bytes(g); var c = string2Bytes(d); var a = []; var f = 1 ; var b = - 1 ; f = Math.floor((Math.random() * 256 )); / / 0 ~ 255 的随机数 var a1 = ((f < 16 ) ? "0" : "") + f.toString( 16 ); console.log( "e=" + e + ",c=" + c + ",f=" + f + ",b=" + b + ",a0=" + a1); a.push(a1); / / 第一个数是随机数, 2 个 16 进制表示的随机数 console.log( "a=" + a); var i = 1 ; $(e).each(function() { if (b < c.length - 1 ) { b + + } else { b = 0 } console.log( "开始加密" ) var t = c[b]; var k = this + f; console.log(this + "," + f + ",c[" + b + "]=" + t + "," + (((k) % 255 ))); f = ((k) % 255 ) ^ t; / / 0 ~ 254 ^ 0 ^ 127 var add = ((f < 16 ) ? "0" : "") + f.toString( 16 ); console.log( "a" + (i + + ) + "=" + add); a.push(add); }); console.log( "a=" + a); return a.join("") }; |
以下是解密脚本
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 | / / LoginPswd = 71a562ba53aa , seesion = whuwk4uvwt0tkcftktkresk5 var pwd = decrpt( '71a562ba53aa' , 'whuwk4uvwt0tkcftktkresk5' ); console.log( 'pwd=' + pwd); / / 解密 function decrpt(encryptHexStr, keyStr){ var keyArr = string2Bytes(keyStr); var c = string2Bytes(keyStr); var b = - 1 ; var firstRandom = hex2int(encryptHexStr[ 0 ] + encryptHexStr[ 1 ]); / / 第一个随机数 var decrptPwd = []; var hex = ''; for (var i = 2 ; i < encryptHexStr.length ; i + = 2 ){ hex = encryptHexStr[i] + encryptHexStr[i + 1 ] ; var j = hex2int( hex ); console.log( "input=" + j); if (b < keyStr.length - 1 ) { b + + } else { b = 0 } var t = c[b]; / / 取出要异或的密钥 var o = j ^ t ; / / 再异或出原来的数 if (o < firstRandom ){ o = o + 255 ; / / 由于原来是”((k) % 255 )” ,所以简单的补上 255 ,逻辑不严谨 } var out = int2CharCode((o - firstRandom)); / / 减去原来加的随机数,解密出来的字符 console.log( 't=' + t + ",firstRandom=" + firstRandom + ",correct=" + out ); firstRandom = j ; / / 下一个随机数 decrptPwd.push(out); } return decrptPwd.join(""); } / / int 转assi 码 function int2CharCode(i){ return String.fromCharCode(i); } / / 16 进制字符串转 int 类型数据 function hex2int( hex ) { var len = hex .length, a = new Array( len ), code; for (var i = 0 ; i < len ; i + + ) { code = hex .charCodeAt(i); if ( 48 < = code && code < 58 ) { code - = 48 ; } else { code = (code & 0xdf ) - 65 + 10 ; } a[i] = code; } return a. reduce (function(acc, c) { acc = 16 * acc + c; return acc; }, 0 ); } / / 字符串 转对应assi 码的数组 function string2Bytes ( str ) { var ch, st, re = []; for (var i = 0 ; i < str .length; i + + ) { ch = str .charCodeAt(i); / / get char st = []; / / set up "stack" do { st.push( ch & 0xFF ); / / push byte to stack ch = ch >> 8 ; / / shift value down by 1 byte } while ( ch ); / / add stack contents to result / / done because chars have "wrong" endianness re = re.concat( st.reverse() ); } / / return an array of bytes return re; } |
总结:这种的加密是使用密钥和随机数,随机数和原密码字符相加,再和密钥字符异或运算(得到的密文字符作为下一个随机数),最后得出加密后的密文。密钥来自session id的值,第一个随机数已经在密文的第一位。该网站的请求是http 请求,所以会出现网络嗅探,抓取到用户登录名和加密后的密码。通过该加密算法分析可破解密码,得到登录名和原密码。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2022-5-27 17:35
被beyondcyx编辑
,原因: 错别字
赞赏
看原图
赞赏
雪币:
留言: