在爬虫的路上,会遇到各种各样的妖魔鬼怪。你不打死她,她就会一直恶心你,直到… …
最近在做登录的时候遇到了密码加密的问题。通过fiddler抓包分析,登录页面后出现一个login.js,一看就是来者不善。js如下:
var login = {
init: function (ctx_) {
login.constVar.ctx__ = ctx_;
login.constVar.encryptPasswordUrl = ctx_ + "/encryptPassword.action";
$("#submitBt").click(this.encrypt);
},
constVar: {
ctx__: "",
encryptPasswordUrl: ""
},
encrypt: function () {
$(this).attr("disabled", "disabled");
$.ajax({
type: "POST",
url: login.constVar.encryptPasswordUrl,
dataType: "json",
success: function (data) {
if (data != null && data.success) {
var encrypt = new JSEncrypt(); # 这里才是重点
encrypt.setPublicKey(data.pubKey);
var encrypted = encrypt.encrypt($('#password').val());
$("#password").val(encrypted);
$("#theForm").submit();
} else {
alert("登录失败:加密登录密码失败!");
$(this).attr("disabled", "");
}
}
});
}
};
$(function () {
document.onkeydown = function (e) {
var ev = document.all ? window.event : e;
if (ev.keyCode == 13) {
login.encrypt();
//$("#theForm").submit();// 处理事件
}
};
});
洋洋洒洒一大篇,重点只有两三行。
var encrypt = new JSEncrypt(); # 新创建了一个实例,调用构造函数JSEncrypt()
encrypt.setPublicKey(data.pubKey); # 公钥,服务器端返回的一串密文
var encrypted = encrypt.encrypt($('#password').val()); # 得到加密后的密码
整个登录的过程逻辑也很简单:
1、加载登陆页面;
2、服务器返回公钥、login.js 及加密js;
他的加密js文件,名称可以任意。我遇到的名字jsencrypt.min.js,2000多行,看起来着实脑壳疼。
3、把密码通过上述三个东西加密后和用户名等一些东西传至后端进行验证,如果成功,就响应登录成功,不然响应登陆失败。
有趣的问题是都有着相同的基因
对js加密文件进行一通光怪陆离的分析过后,什么也没有发现(意料之中的,这么容易看懂,搞加密个球),,,,但是!, 但是!发现了一段话:
/*
* asn1.js - ASN.1 DER encoder classes
*
* Copyright (c) 2013 Kenji Urushima (kenji.urushima@gmail.com)
*
* This software is licensed under the terms of the MIT License.
* http://kjur.github.com/jsrsasign/license
*
* The above copyright and license notice shall be
* included in all copies or substantial portions of the Software.
*/
敢情, 是2013年出来祸害人的。发布出来,意味着,别人可以免费拿过来加密(作者这个老头坏得很),但是也意味着已经经授大神们的破解这么多年了。
所以我相信,一定有这方面的资料,所以运用了各方面的资源,盘他!!!!
结果呢??
他采用了一种加密算法,这种加密算法就是地球上最重要的加密算法——RSA非对称加密
对SRA加密的介绍参考](http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html)
1、如果对算法有兴趣,可以自己写编程进行加密和解密
可以参考:
https://www.cnblogs.com/xautxuqiang/p/6067456.html
2、当然,大部份同学都是不想写的
当铺也也可以,可以使用其他的第三方库进行加密和解密,直接上code:
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
def crack_pwd(pwd):
key = """-----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALxi\/Oa\/tT5rD9BO\/fX+ND+EZOKggbl+yILFxBy8CuoQvINcr8T1Rri3xVFss1o57UDclWR4i+zwEm2bsrVfRc8CAwEAAQ==
-----END PUBLIC KEY-----""" #注意上述key的格式
rsakey = RSA.importKey(key)
cipher = Cipher_pkcs1_v1_5.new(rsakey) # 生成对象
cipher_text = base64.b64encode(cipher.encrypt(pwd.encode(encoding="utf-8"))) # 对传递进来的用户名或密码字符串加密
value = cipher_text.decode('utf8') # 将加密获取到的bytes类型密文解码成str类型
return value
pwd = "123456111111111111111111111123911111fffffffaafaqewf1s"
# 亲测,这种方式加密密文的长度最多只能53个数字和英文字母。 这个跟公钥有关
# 全是中文只能加密17个
encrypted = crack_pwd(pwd)
print(encrypted)
运行结果如下:
UMsPvV7oBO7gfgZVYO+Ze+/KraP2ze+kXmTJ/pUVjkc+ZwvfdH4ZLaldBoElLhpRk2JdyFXMRN87Ce/Bw3P50Q==
这里就只写加密的过程了。
私钥解密的过程可以参考:
https://www.cnblogs.com/piperck/p/7257043.html