您的位置:首页 > Web前端 > JavaScript

python 实现javascript加密思路[转载]

2016-03-22 19:47 567 查看
第一种是改写JavaScript的代码
这没什么好说的,不过只适用于比较小而且不复杂的JavaScript代码片段。比如人人网上发站内信的页面有这样的一个隐藏post数据:
1. <input type="hidden" name="biz" value=0 id="xn_biz"/>
在页面上biz的值为0,但是post的时候就会变成类似于941_683291223928232的字串,仔细看一下页面的源代码,就会发现这段验证的加密字串是通过一段JavaScript的代码生成的:
2. <script>var mREOQQ=’A`ZDu^`’;var VKMHX=’^&+*L/~’;var

uCHKAU=0;var rTIU;var wCJS=”;var yAYH=Math.floor

(VKMHX.length/2);while(uCHKAU<mREOQQ.length)

{rTIU=mREOQQ.charCodeAt(uCHKAU++);var aYDG=VKMHX.

charCodeAt(rTIU%VKMHX.length);aYDG=String.

fromCharCode(aYDG);if(aYDG==’L')aYDG=’<<

;if(aYDG==’~')wCJS+=~rTIU*(-1);else{wCJS+=Math.

floor(eval(rTIU+aYDG+yAYH));}}var ab=941;

ab+="_";ab+=wCJS; document.getElementById("xn_biz")

.value=ab;</script>
这其实类似一段小型的验证加密,它先随机生产一段字串,复制给随机产生的一个变量名,再随机生成一段运算符,复制给另一个随机生成的变量名,然后对这两个变量进行一系列操作和运算,生成一个类似于941_683291223928232的字串。每次刷新页面这段代码中产生的字串和变量名都是不一样的,但是仔细研究这段代码,算法都是相同的,只要得到字串和运算符串,就可以生成这串验证密钥了。
所以将这段代码简单的改写成python代码,问题得到解决,在python模拟网站的JavaScript加密过程下面代码中code就是提取出来的上述JavaScript代码中的mREOQQ,operator代表VKMHX,而xn则代表ab的初始值,最后得到的xn_biz就是我们最终需要的验证密钥了。
3. def __genBizCode(code, operator, xn):
4.
rXHU = unicode( code )
5.
yAMKEN = operator
6. VCHEN, yEEJ, eLKKIH = (0, 0, ”);
7.
KFNQH = int( len(yAMKEN)/2 );
8. while VCHEN < len(rXHU):
9.
yEEJ = ord(rXHU[VCHEN])
10. VCHEN += 1
11.
index = yEEJ % len(yAMKEN)
12.
dDWE = ord( yAMKEN[index] )
13.
dDWE = chr(dDWE)
14. if dDWE==’L':
15.
dDWE = ‘<<
16. if dDWE==’~':
17. eLKKIH += str( ~yEEJ*(-1) )
18. else:
19.
reg = ‘%d%s%d’ % ( yEEJ, dDWE, KFNQH)
20. eLKKIH += str( int( eval(reg) ) )
21.
xnxn_biz = xn + ‘_’
22. xn_biz += eLKKIH
23. return xn_biz
24.
这种方法没有依赖性,但是使用的范围较窄,一是要求算法简单才能改写,二是要求算法固定,如果每次刷新页面算法都不一样,这种方法就不使用了。下面会谈到一种通用性的方法。
第二种是在python中运行js代码由于QZone和QQ校友登陆的时候,post的密码都进行了加密,搜索了一下,发现很多人都研究过这个东东。腾讯将用户的密码和验证码一起,通过一些js代码进行加密,生成一个32为的密钥最终post到服务器上。
对于这个加密算法,网上大部分流传的说法是,先将用户密码进行3次md5的加密,转成大写的32位字符串,再将验证转换成大写,与前面的32位md5大写字符串相加,得到一个36位的字符串,最后对这个36位的字串进行md5加密并转换成大写字串,得到最终post的密钥。
网上很多人说用标准的md5加密,但是我用python的hashlib里的md5进行上述的加密,得到的结果却与标准结果不同,于是只能寻求其他办法。后来在Google的时候搜到了在python中利用windows的插件Windows ScriptControl运行其他脚本语言的方法,不仅适用js,还可以运行vbs等。
首先需要安装Windows ScriptControl插件,可以去微软的官网上下载。 http://sourceforge.net/projects/pywin32/files/pywin32/Build%20214/pywin32-214.win32-py2.6.exe/download 其次还需要安装python的win32库,然后就可以简单的如下执行:
25. import win32com.client
26. def readJsFile(filename):
27.
fp = file( filename, ‘r’ )
28.
lines = ”
29. for line in fp:
30. lines += line
31. return lines
32. def driveJsCode(code, func, paras=None):
33.
js = win32com.client.Dispatch

(’MSScriptControl.ScriptControl’)
34.
js.Language = ‘JavaScript’
35.
js.AllowUI = False
36. js.AddCode( code )
37. if paras:
38. return js.Run(func, paras[0], paras[1])
39. else:
40. return js.Run(func)
41. if __name__ == ‘__main__’:
42.
code = readJsFile( ‘comm.js’ )
43.
p = driveJsCode

( code, ‘myPreProcess’, [password, verfcode] )
44. print ‘The decoded code is %s’ % p
这种方法通用性强,而且即使服务器改变算法,依然可以得到正确的加密验证码。以上的相关内容就是对Python模拟网页的javascript加密验证处理的相关内容的介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: