登录加密js
‘壹’ 前端js 加密解密方式
一、base64加密
使用JS函数的window.btoa()和 window.atob(),分别是编码和解码
二、编码和解码字符串
使用JS函数的escape()和unescape(),分别是编码和解码
三、AES加密解密
四、RSA加密解密
‘贰’ 镐庝箞浣跨敤js sha512锷犲瘑
浣跨敤js sha512锷犲瘑镄勬柟娉曪细
1銆侀栧厛铡籫it涓娄笅杞絪ha512.js寮曞叆闇瑕佽皟鐢ㄧ殑椤甸溃涓娿
2銆佽皟鐢ㄦ柟娉曪纴鍦╤ead鍜</head>涔嬮棿镄剆cript镙囩惧啓鍏ヤ互涓媕s浠g爜锛
function calcHash() {
try {
var hashInput = document.getElementById("hashInputText");
var hashInputType = document.getElementById("hashInputType");
var hashVariant = document.getElementById("hashVariant");
var hashRounds = document.getElementById("hashRounds");
var hashOutputType = document.getElementById("hashOutputType");
var hashOutput = document.getElementById("hashOutputText");
var hashObj = new jsSHA(
hashVariant.options[hashVariant.selectedIndex].value,
hashInputType.options[hashInputType.selectedIndex].value,
{numRounds: parseInt(hashRounds.value, 10)}
);
hashObj.update(hashInput.value);
hashOutput.value = hashObj.getHash(hashOutputType.options[hashOutputType.selectedIndex].value);
} catch(e) {
hashOutput.value = e.message
}
}
function calcHMAC() {
try {
var hmacText = document.getElementById("hmacInputText");
var hmacTextType = document.getElementById("hmacTextType");
var hmacKeyInput = document.getElementById("hmacInputKey");
var hmacKeyInputType = document.getElementById("hmacKeyType");
var hmacVariant = document.getElementById("hmacVariant");
var hmacOutputType = document.getElementById("hmacOutputType");
var hmacOutput = document.getElementById("hmacOutputText");
var hmacObj = new jsSHA(
hmacVariant.options[hmacVariant.selectedIndex].value,
hmacTextType.options[hmacTextType.selectedIndex].value
);
hmacObj.setHMACKey(
hmacKeyInput.value,
hmacKeyInputType.options[hmacKeyInputType.selectedIndex].value
);
hmacObj.update(hmacText.value);
hmacOutput.value = hmacObj.getHMAC(hmacOutputType.options[hmacOutputType.selectedIndex].value);
} catch(e) {
hmacOutput.value = e.message
}
}
鍏朵腑jsSHA鏄痵ha512.js鍐呭凡缁忓疄鐜扮殑鏂规硶銆
‘叁’ 如何使用CryptoJS的AES方法进行加密和解密
首先准备一份明文和秘钥:
var plaintText = 'aaaaaaaaaaaaaaaa' // 明文
var keyStr = 'bbbbbbbbbbbbbbbb' // 一般key为一个字符串
参看官网文档,AES方法是支持AES-128、AES-192和AES-256的,加密过程中使用哪种加密方式取决于传入key的类型,否则就会按照AES-256的方式加密。
CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key.
由于Java就是按照128bit给的,但是由于是一个字符串,需要先在前端将其转为128bit的才行。
最开始以为使用CryptoJS.enc.Hex.parse就可以正确地将其转为128bit的key。但是不然...
经过多次尝试,需要使用CryptoJS.enc.Utf8.parse方法才可以将key转为128bit的。好吧,既然说了是多次尝试,那么就不知道原因了,后期再对其进行更深入的研究。
// 字符串类型的key用之前需要用uft8先parse一下才能用
var key = CryptoJS.enc.Utf8.parse(keyStr);
由于后端使用的是PKCS5Padding,但是在使用CryptoJS的时候发现根本没有这个偏移,查询后发现PKCS5Padding和PKCS7Padding是一样的东东,使用时默认就是按照PKCS7Padding进行偏移的。
// 加密
var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
由于CryptoJS生成的密文是一个对象,如果直接将其转为字符串是一个Base64编码过的,在encryptedData.ciphertext上的属性转为字符串才是后端需要的格式。
var encryptedBase64Str = encryptedData.toString();
// 输出:'+ot8JuxWVdLgY=
console.log(encryptedBase64Str);
// 需要读取encryptedData上的ciphertext.toString()才能拿到跟Java一样的密文
var encryptedStr = encryptedData.ciphertext.toString();
// 输出:'
console.log(encryptedStr);
由于加密后的密文为128位的字符串,那么解密时,需要将其转为Base64编码的格式。
那么就需要先使用方法CryptoJS.enc.Hex.parse转为十六进制,再使用CryptoJS.enc.Base64.stringify将其变为Base64编码的字符串,此时才可以传入CryptoJS.AES.decrypt方法中对其进行解密。
// 拿到字符串类型的密文需要先将其用Hex方法parse一下
var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr);
// 将密文转为Base64的字符串
// 只有Base64类型的字符串密文才能对其进行解密
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);
使用转为Base64编码后的字符串即可传入CryptoJS.AES.decrypt方法中进行解密操作。
// 解密
var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
经过CryptoJS解密后,依然是一个对象,将其变成明文就需要按照Utf8格式转为字符串。
// 解密后,需要按照Utf8的方式将明文转位字符串
var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);
console.log(decryptedStr); // 'aaaaaaaaaaaaaaaa'
‘肆’ 京东post登陆参数js分析,密码加密的RSA加密实现
老规矩先用错误信息登陆一下抓一下包,看看有那些post字段:
大概我们就知道我们要分析的字段有nloginpwd其余字段还不清楚,就在上下在看看其他数据包,根据pubkey我们猜测加密方式大概是RSA,继续查看其他数据包,找到一个有价值的get包
信息是:
没有发现明确的关键字,但是可以猜想bg、challenge、patch应该和我们的加密参数相关,但是不确定,只有继续分析加密的js片段:
其中好几个字段都是$("#??")格式,这种表示是来自页面的,那在看看网页源码
果然发现了很多有价值的东西在post表单中的,其中只有两个参数是需要单独获取的,其余都是从html源码里面解析出来的
authcode来源
是获取的源码中的一个值,再看源码
看样子是在验证码操作的时候触发的一个请求,返回的authcode的值,查看authcode请求的数据包
这个请求看起来不是那么友好,有好几个疑似加密字段,这个参数暂时放放,继续分析我们的passWord的加密。
继续深入getEntryptPwd($('#nloginpwd').val()),查看源码
核心的就两行
encrypt.setPublicKey(pubKey); return encrypt.encrypt(pwd);这必定是RSA加密无疑了,继续查看源码,单独的一个源码文件,一共3300多行,删减版如下
JSEncrypt是前端使用的实现RSA加密的库,看样子应该比较标准,那就试试能不能改写了,复制全部源码到node.js,会提示navigator、window未定义,这个问题很简单,在文件头定义
var navigator = this;
var window = this
然后在文件尾部写个调用程序试试
是可以成功返回RSA加密结果的
京东的post请求不是太难,参数也能在源码中找到,但是他的难度在发出post请求之前的一个get请求,这个get请求和验证有关,和用户名相关,简单看了一下感觉有点复杂,留在第二篇讲获取authcode参数的其他参数是怎么来的。
ID:python之战
|作|者|公(zhong)号:python之战
专注Python,专注于网络爬虫、RPA的学习-践行-总结
喜欢研究和分享技术瓶颈,欢迎关注
独学而无友,则孤陋而寡闻!
‘伍’ 怎么用 python 模拟 js 里 JSEncrypt 模块的加密方式
PC登录新浪微博时,在客户端用js预先对用户名、密码都进行了加密,而且在POST之前会GET一组参数,这也将作为POST_DATA的一部分。这样,就不能用通常的那种简单方法来模拟POST登录(比如人人网)。
通过爬虫获取新浪微博数据,模拟登录是必不可少的。
1、在提交POST请求之前,需要GET获取四个参数(servertime,nonce,pubkey和rsakv),不是之前提到的只是获取简单的servertime,nonce,这里主要是由于js对用户名、密码加密方式改变了。
1.1 由于加密方式的改变,我们这里将使用到RSA模块,有关RSA公钥加密算法的介绍可以参考网络中的有关内容。下载并安装rsa模块:
下载:https//pypi.python.org/pypi/rsa/3.1.1
rsa模块文档地址:http//stuvel.eu/files/python-rsa-doc/index.html
根据自己的Python版本选择适合自己的rsa安装包(.egg),在win下安装需要通过命令行使用easy_install.exe(win上安装setuptool从这里下载:setuptools-0.6c11.win32-py2.6.exe 安装文件 )进行安装,例如:easy_install rsa-3.1.1-py2.6.egg,最终命令行下测试import rsa,未报错则安装成功。
1.2 获得以及查看新浪微博登录js文件
查看新浪通行证url (http//login.sina.com.cn/signup/signin.php)的源代码,其中可以找到该js的地址 http//login.sina.com.cn/js/sso/ssologin.js,不过打开后里面的内容是加密过的,可以在网上找个在线解密站点解密,查看最终用户名和密码的加密方式。
1.3 登录
登录第一步,添加自己的用户名(username),请求prelogin_url链接地址:
prelogin_url = 'http//login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)' % username
使用get方法得到以下类似内容:
sinaSSOController.preloginCallBack({"retcode":0,"servertime":1362041092,"pcid":"gz-","nonce":"IRYP4N","pubkey":"","rsakv":"1330428213","exectime":1})
进而从中提取到我们想要的servertime,nonce,pubkey和rsakv。当然,pubkey和rsakv的值我们可以写死在代码中,它们是固定值。
2、之前username 经过BASE64计算:
复制代码 代码如下:
username_ = urllib.quote(username)
username = base64.encodestring(username)[:-1]
password经过三次SHA1加密,且其中加入了 servertime 和 nonce 的值来干扰。即:两次SHA1加密后,结果加上servertime和nonce的值,再SHA1算一次。
在最新的rsa加密方法中,username还是以前一样的处理;
password加密方式和原来有所不同:
2.1 先创建一个rsa公钥,公钥的两个参数新浪微博都给了固定值,不过给的都是16进制的字符串,第一个是登录第一步中的pubkey,第二个是js加密文件中的‘10001'。
这两个值需要先从16进制转换成10进制,不过也可以写死在代码里。这里就把10001直接写死为65537。代码如下:
复制代码 代码如下:
rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到
passwd = rsa.encrypt(message, key) #加密
passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
2.2 请求通行证url:login_url =‘http//login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)'
需要发送的报头信息
复制代码 代码如下:
postPara = {
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'userticket': '1',
'ssosimplelogin': '1',
'vsnf': '1',
'vsnval': '',
'su': encodedUserName,
'service': 'miniblog',
'servertime': serverTime,
'nonce': nonce,
'pwencode': 'rsa2',
'sp': encodedPassWord,
'encoding': 'UTF-8',
'prelt': '115',
'rsakv' : rsakv,
'url': 'http//weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META'
}
请求的内容中添加了rsakv,将pwencode的值修改为rsa2,其他跟以前一致。
将参数组织好,POST请求。检验是否登录成功,可以参考POST后得到的内容中的一句 location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3");
如果retcode=101则表示登录失败。登录成功后结果与之类似,不过retcode的值是0。
3、登录成功后,在body中的replace信息中的url就是我们下一步要使用的url。然后对上面的url使用GET方法来向服务器发请求,保存这次请求的Cookie信息,就是我们需要的登录Cookie了。
‘陆’ js中常见的数据加密与解密的方法
加密在我们前端的开发中也是经常遇见的。本文只把我们常用的加密方法进行总结。不去纠结加密的具体实现方式(密码学,太庞大了)。
常见的加密算法基本分为这几类,
RSA加密:RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。(这才是正经的加密算法)
非对称加密算法:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法
DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
AES这个标准用来替代原先的DES
DES/AES我们合并在一起介绍其用法和特点
Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法。只是看上去像是加密而已(吓唬人)。
‘柒’ 记录一下前端使用CryptoJS的几种加密方式
自己太小白了,之前在PC端项目中使用的MD5加密,现在的小程序项目使用了 CryptoJS 里面的 enc-base64 和 hmac-sha1 ,之前没有用到过这两种,所以比较疑惑,为何在小程序不继续使用 MD5 呢?所以在这里记录一下自己解疑惑的一些知识点。
随着互联网的兴起,我们对信息的安全越来越受重视,这样就导致在web开发中,对用户密码等各种加密变得更加重要了。与服务器的交互中,为了确保数据传输的安全性,避免被黑客抓包篡改。
对于Base64编码的,我觉得看一篇文章能够解决你的疑惑,我在这里就不赘述了
🧐 Base64编码原理
如: 用户密码,请求参数,文件加密
如: 接口参数签名验证服务
支付数据、CA数字证书
前端的朋友可能会关注前端js加密,我们在做 WEB 的登录功能时一般是通过 Form 提交或 Ajax 方式提交到服务器进行验证的。为了防止抓包,登录密码肯定要先进行一次加密(RSA),再提交到服务器进行验证。一些大公司都在使用,比如淘宝、京东、新浪 等。
前端加密也有很多现成的js库,如:
JS-RSA: 用于执行OpenSSL RSA加密、解密和密钥生成的Javascript库, https://github.com/travist/jsencrypt
MD5: 单向散列加密md5 js库, https://github.com/blueimp/JavaScript-MD5
crypto-js: 对称加密AES js库, https://github.com/brix/crypto-js
-CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。
HMAC 系列是消息验证,用于验证一个消息是否被篡改——如网站上传递 email 和 hmac(email),则接收时可以通过 hmac(email) 获知 email 是否是用户伪造的
‘捌’ JS加密方法
本文一共介绍了七种方法:
一:最简单的加密解密
二:转义字符""的妙用
三:使用Microsoft出品的脚本编码器Script Encoder来进行编码 (自创简单解码)
四:任意添加NUL空字符(十六进制00H) (自创)
五:无用内容混乱以及换行空格TAB大法
六:自写解密函数法
七:错误的利用 (自创)
在做网页时(其实是网页木马呵呵),最让人烦恼的是自己辛辛苦苦写出来的客户端IE运行的JAVASCRIPT代码常常被别人轻易的拷贝,实在让自己的心里有点不是滋味,要知道自己写点东西也挺累的......^*^
但我们也应该清楚地认识到因为JAVASCRIPT代码是在IE中解释执行,要想绝对的保密是不可能的,我们要做的就是尽可能的增大拷贝者复制的难度,让他知难而退(但愿~!~),下面我结合自己这几年来的实践,及个人研究的心得,和大家一起来探讨一下网页中JAVASCRIPT代码的加密解密技术。
以加密下面的JAVASCRIPT代码为例:
<SCRIPT LANGUAGE="JavaScript">
alert("《黑客防线》");
</SCRIPT>
一:最简单的加密解密
大家对于JAVASCRIPT函数escape()和unescape()想必是比较了解啦(很多网页加密在用它们),分别是编码和解码字符串,比如例子代码用escape()函数加密后变为如下格式:
alert%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B
如何?还看的懂吗?当然其中的ASCII字符"alert"并没有被加密,如果愿意我们可以写点JAVASCRIPT代码重新把它加密如下:
%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B
呵呵!如何?这次是完全都加密了!
当然,这样加密后的代码是不能直接运行的,幸好还有eval(codeString)可用,这个函数的作用就是检查JavaScript代码并执行,必选项 codeString 参数是包含有效 JavaScript 代码的字符串值,加上上面的解码unescape(),加密后的结果如下:
<SCRIPT LANGUAGE="JavaScript">
var code=unescape("%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B");
eval(code)
</SCRIPT>
是不是很简单?不要高兴,解密也就同样的简单,解密代码都摆给别人啦(unescape())!呵呵
二:转义字符""的妙用
大家可能对转义字符""不太熟悉,但对于JavaScript提供了一些特殊字符如:n (换行)、 r (回车)、' (单引号 )等应该是有所了解的吧?其实""后面还可以跟八进制或十六进制的数字,如字符"a"则可以表示为:"141"或"x61"(注意是小写字符"x"),至于双字节字符如汉字"黑"则仅能用十六进制表示为"u9ED1"(注意是小写字符"u"),其中字符"u"表示是双字节字符,根据这个原理例子代码则可以表示为:
八进制转义字符串如下:
<SCRIPT LANGUAGE="JavaScript">
eval("")
</SCRIPT>
十六进制转义字符串如下:
<SCRIPT LANGUAGE="JavaScript">
eval("")
</SCRIPT>
这次没有了解码函数,因为JavaScript执行时会自行转换,同样解码也是很简单如下:
<SCRIPT LANGUAGE="JavaScript">
alert("")
</SCRIPT>
就会弹出对话框告诉你解密后的结果!
‘玖’ 网页用js md5加密
不能破解,md5基本上不能破解,只有一些常见的密码可以破解