python+JS怎么实现逆向SMZDM登录加密

1. 介绍

SMZDM是一个海淘购物指南网站,可供不同国家地区的用户使用。如果想要爬取其数据或者使用SMZDM的API进行某些操作,需要登录。登录时,用户名和密码会被加密,加密方式由SMZDM自己研发。本文将详细介绍如何通过Python和JavaScript进行逆向破解SMZDM登录加密算法。

2. 分析

SMZDM的登录加密主要涉及两个部分:前端JavaScript的加密逻辑和后端Python的解密逻辑。下文将详细介绍这两个部分的分析及实现方法。

2.1 前端JavaScript加密逻辑

打开SMZDM的登录页面(https://zhiyou.smzdm.com/user/login),右键点击查看源代码,找到以下部分:

function encryptPwd(pwd, pubKey, rsaPwd) {

var crypt = new JSEncrypt();

crypt.setPublicKey(pubKey);

rsaPwd = encodeURIComponent(rsaPwd);

var secret = crypt.encrypt(rsaPwd);

var password = CryptoJS.MD5(pwd).toString();

secret = CryptoJS.AES.encrypt(secret, CryptoJS.enc.Utf8.parse(password), {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

}).toString();

return secret;

}

这就是SMZDM的登录加密函数。其核心加密逻辑是使用了JsEncrypt库进行RSA加密和CryptoJS库进行AES加密。下面分别介绍这两种加密算法的原理。

2.1.1 RSA加密

RSA加密算法是一种常用的非对称加密算法,它的基本原理是利用公钥加密、私钥解密实现信息加密和数字签名的功能。在SMZDM的加密函数中,RSA的公钥是由SMZDM后台生成的,前端JavaScript从后台获取到这个公钥之后,使用JsEncrypt库对密码进行RSA加密。具体实现见下面的代码:

var crypt = new JSEncrypt();

crypt.setPublicKey(pubKey);

rsaPwd = encodeURIComponent(rsaPwd);

var secret = crypt.encrypt(rsaPwd);

这里用到了JsEncrypt库的setPublicKey函数和encrypt函数。

2.1.2 AES加密

AES加密算法是一种对称加密算法,其基本原理是将明文分组,每一组进行加密后得到一个密文分组。SMZDM的加密函数中,AES使用了ECB模式和Pkcs7补位方式。ECB模式是常用的分组密码的块加密模式之一,具体实现可见下面的代码:

secret = CryptoJS.AES.encrypt(secret, CryptoJS.enc.Utf8.parse(password), {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

}).toString();

这里用到了CryptoJS库的AES和MD5函数。

2.2 后端Python解密逻辑

SMZDM的加密密钥是通过了前台的javascript进行加密后,在后台进行解密。后台是使用Python来解密密钥的。加密密钥的解密算法是有点繁琐的,涉及的知识也比较多。接下来我们详细介绍解密算法的实现。

2.2.1 获取JavaScript源码

首先要获取JS加密函数的源代码。在浏览器的开发者工具中,打开SMZDM登录页面,切换到Sources选项卡,找到名为login.min.js的文件。点击文件名即可获取源代码。将获取到的源代码保存起来,后面会用到。

2.2.2 提取加密密钥

在解密密钥之前需要先提取密钥本身,这可以通过在JS源代码中查找publicKey的值来实现。publicKey就是SMZDM给的公钥,它会在每次登录时动态变化,因此需要每次获取最新的公钥。

2.2.3 分析RSA加密

RSA加密在前台JavaScript中已经完成了,这里主要是对JavaScript代码进行分析,找到加密前和加密后的数据格式。

在SMZDM的加密函数中,会将密码经过RSA加密后得到一个密文secret,这个密文就是接下来要破解的密文。

2.2.4 分析AES加密

AES加密算法在前台JavaScript中也已经完成了,这里同样是对JavaScript代码进行分析,找到加密前和加密后的数据格式。

SMZDM在进行AES加密时使用的是ECB模式和Pkcs7补位方式。具体的实现过程可以查看前面的代码。解密过程就是对加密过程的逆过程。SMZDM使用的是python的Crypto库,这里介绍一下使用Crypto库来进行AES解密的方法。

2.2.5 解密密钥

解密密钥需要将在前台JavaScript中加密密钥的过程逆转过来。这里需要注意SMZDM在使用现代加密算法时都会使用HTTPS传输数据,防止数据被中间人攻击利用。因此在此之前需要先完成一个HTTPS的请求模块。

在HTTPS的请求模块完成后,我们需要进行以下步骤来解密密钥:

- 首先,需要将从前台获取到的公钥解码。

- 然后,需要对密文进行另外一层解码。

- 将解码后的密钥进行解密,得到明文的密钥。

3. 实现

下面是使用Python和JavaScript实现逆向破解SMZDM登录加密算法的代码示例。其中,HTTP请求使用requests库,RSA解密使用pycryptodome库,AES解密使用Crypto库,密码加密使用其它库(这里使用了passlib库)。

import base64

import requests

from Crypto.Cipher import AES

from Crypto.PublicKey import RSA

from Crypto.Cipher import PKCS1_v1_5

from passlib.hash import md5_crypt

key = ''

iv = ''

def get_login_key():

global key

global iv

url = 'https://zhiyou.smzdm.com/user/login/ajax_get_key'

response = requests.get(url)

json_data = response.json()

key = base64.b64decode(json_data['data']['key'])

iv = base64.b64decode(json_data['data']['iv'])

def rsa_decrypt(message):

rsa_key = RSA.import_key(key)

cipher = PKCS1_v1_5.new(rsa_key)

data = cipher.decrypt(base64.b64decode(message), None)

return data.decode('utf-8')

def smzdm_login(username, password):

get_login_key()

url = 'https://zhiyou.smzdm.com/user/login/ajax_login'

header = {

'Content-Type': 'application/x-www-form-urlencoded',

'Referer': 'https://zhiyou.smzdm.com/user/login'

}

rsa_pwd = md5_crypt.encrypt(password).split('$')[-1]

rsa_key_password = rsa_decrypt(username)

rsa_key_password += '|'

rsa_key_password += rsa_decrypt(rsa_pwd)

password_md5 = md5_crypt.encrypt(password, salt=rsa_key_password).split('$')[-1]

password_md5 = rsa_decrypt(password_md5)

crypt = AES.new(key, AES.MODE_CBC, iv)

rsa_key_password_encode = crypt.encrypt(rsa_key_password.encode('utf-8')).hex()

payload = {

'username': username,

'password': password_md5,

'rememberme': 1,

'captcha': '',

'login_key': rsa_key_password_encode,

'disable_other_login': '0'

}

response = requests.post(url, headers=header, data=payload)

return response.json()

4. 总结

SMZDM登录加密算法的破解过程虽然有点繁琐,但只要按照本文所述的方法进行,仍然可以比较容易地进行实现。其中,最困难的部分是对加密密钥进行解密,这需要一些加密算法和协议的了解。如果想要更深入地研究密码学和加密算法,这是一篇不错的入门文献。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签