目录
js逆向之对称加密&west交大登录密码
什么是DES?
什么是AES?
实例演示--某大学官网
找加密?
关键字搜索
第一处:
找到其加密码代码
下断点
扣代码
这js代码怎么运行呢?
如何使用node运行js代码?
下载这个加密算法对象库
引用(对象)
传参
联动python
py代码
js代码
免责声明:本文仅供技术交流学习,请勿用于其它违法行为.
对称加密 aes des
什么是DES?
DES(使用密钥加密的块算法)_百度百科
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
什么是AES?
高级加密标准_百度百科
这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
对称/分组密码一般分为流加密(如OFB、CFB等)和块加密(如ECB、CBC等)。对于流加密,需要将分组密码转化为流模式工作。对于块加密(或称分组加密),如果要加密超过块大小的数据,就需要涉及填充和链加密模式。
是DES的升级版...更安全了.
实例演示--某大学身份认证
找加密?
进入网站界面,需要登录,密码一般都需要密文传输,它不可能直接明文.
我们没有号,那就随便输入账号,密码.(POST)
然后,我们分析数据包吧.
--这里我们一看,很显然,密码进行了加密.
(登录的逆向很多的...)
关键字搜索
这里的login.html很显然就不是了,点进去看,它就是一个标签属性而已.
所以,我们就找login.js里面的:
第一处:
$('.pwd').val('')
这个写法就是jQuery.
jQuery就是js库.
获取标签为pwd的,传空值.
类似于: 标签对象.value=''
类似于:
<input type='password' class='pwd'>
document.getElementByClassName('pwd')[0].value='abc'
$('.pwd').val('') 这里代码为空,所以就是空值.
--不是加密...空空如也...
...找呀找...
最后找到了!
找到其加密码代码
这就是一个优秀的程序员,加密方式都写你脸上了,方便大家,嘿嘿黑~
优秀,我要学习...
下断点
--登录,断住了,那就是此处了.
// 获取公钥--接口 function getPublicKey() { // 2 IE兼容 var publicKey = '0725@pwdorgopenp'; //定义key //密码进行AES加密 var pwdVal = $('.pwd')[1].value|| $('.pwd')[0].value var encrypts = CryptoJS.AES.encrypt(pwdVal, CryptoJS.enc.Utf8.parse(publicKey), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); var params = { 'loginType': 1, //登录方式 'username': $('.username')[1].value || $('.username')[0].value, 'pwd':encrypts, 'jcaptchaCode':$('.text_yan')[1].value || $('.text_yan')[0].value }; login(params); }
断点挨着走,我们发现这个 pwdVal 就是我们提交的密码的明文.
这个 encrypts 对象出来后就是密文了...
往后看,很显然,这个 params 对象里面的 'pwd':encrypts, 就是我们的密码. (就是从上面加密过来的.)
那就不用往下看了.
AES加密
扣代码
那我们这里直接给它安排扣代码.
function getPublicKey() { // 2 IE兼容 var publicKey = '0725@pwdorgopenp'; //定义key //密码进行AES加密 var pwdVal = $('.pwd')[1].value|| $('.pwd')[0].value var encrypts = CryptoJS.AES.encrypt(pwdVal, CryptoJS.enc.Utf8.parse(publicKey), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); var params = { 'loginType': 1, //登录方式 'username': $('.username')[1].value || $('.username')[0].value, 'pwd':encrypts, 'jcaptchaCode':$('.text_yan')[1].value || $('.text_yan')[0].value }; login(params); }
这js代码怎么运行呢?
浏览器本身支持js代码运行 单独的js文件没办法使用浏览器运行 安装一个独立运行js文件的工具:node.js --这个安装工具就不说了吧.(注意设置环境变量)
如何使用node运行js代码?
node 文件路径
--这扣下来的代码,我们只需要关注加密的代码就行了,其它删掉就行.
这里我们运行一下,显然报错了.
var encrypts = CryptoJS.AES.encrypt(pwdVal, CryptoJS.enc.Utf8.parse(publicKey), {
CryptoJS 这是个加密算法库.
下载这个加密算法对象库
不得不说,这个对象(库)的加密算法真多...
它有这个CryptoJS对象,想用哪个加密就用哪个.
那我们没有对象,怎么办呢?
我们自己也可以安装加密算法库.
在node中安装.
node == python
npm == pip
npm install 库名
npm install crypto-js
--这里我们安装后,它会在我们的目录下生三个东西.
第一个文件夹里面就有我们要的. --准备调用.
那就准备导入那个对象了.(^▽^)
引用(对象)
var CryptoJS = require('crypto-js') --------- ReferenceError: pwdVal is not defined
--这里又报错了, pwdVal
传参
这个 pwdVal 眼不眼熟啊!!?,上面我们说过,它的值就是我们输入的明文密码.
这里我们把这个参数pwdVal给函数传参就行了.
var CryptoJS = require('crypto-js') function getPublicKey(pwdVal) { // 2 IE兼容 var publicKey = '0725@pwdorgopenp'; //定义key //密码进行AES加密 // var pwdVal = $('.pwd')[1].value|| $('.pwd')[0].value var encrypts = CryptoJS.AES.encrypt(pwdVal, CryptoJS.enc.Utf8.parse(publicKey), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); return encrypts //返回加密后的密码值 } console.log(getPublicKey('123456abc')) -------------------- YJJAQHE8GE5aErQJ+jCktA==
--成功拿下.加密值.
联动python
模拟前端做加密,但是加密之后产生的密文值,需要要python接收.
python中需要调用js代码文件,拿到加密值.
如果想要让python执行某一个js文件,需要安装一个库: pyexecjs
pip install pyexecjs
导入库中的execjs模块
py代码
#py文件 ----------------- import execjs #加载js代码,返回js对象. execjs.compile(js代码) # execjs.compile() #位置参数,有就传. 默认参数:a=1/不传. #js代码怎么来: #1-直接复制js代码,作为位置实参传入. #2-读取js文件,把读取的内容作为位置实参. with open('6-西安交大.js', 'r', encoding='utf-8')as f: js_code = f.read() #js_code保存的整个文件的文本内容.(js代码) #加载js代码 o = execjs.compile(js_code) #运行js代码,(调用某个加密函数) #对象.call(js代码中要调用的函数名,调用函数传入的实参) #调用函数传入的实参: 有就传;有多个,用逗号隔开; 没有就不传. print(o.call('getPublicKey', '123456abc')) #call方法,返回的就是js函数的返回值.
js代码
#js文件 ------------------- var CryptoJS = require('crypto-js') function getPublicKey(pwdVal) { // 2 IE兼容 var publicKey = '0725@pwdorgopenp'; //定义key //密码进行AES加密 // var pwdVal = $('.pwd')[1].value|| $('.pwd')[0].value var encrypts = CryptoJS.AES.encrypt(pwdVal, CryptoJS.enc.Utf8.parse(publicKey), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); return encrypts //返回加密后的密码值 } console.log(getPublicKey())
--到这我们就拿下了...