关于维普中文期刊登录参数AES加密问题

关于维普中文期刊登录参数加密问题

1、前言

  =遇见一个问题,在登录维普时,发现存在一个参数加密:

LoginUserName: admin
LoginUserPassword: 21232f297a57a5a743894a0e4a801fc3
LoginType: normallogin
IsWeakPassword: 1
va: hxEFDe0//cSdGeUPnhmvYQ==

  通过上述参数可以发现,账号是明文,密码是md5 32位加密,va疑似加密,故针对va进行了深入分析,问题还是比较简单的,写这篇文章主要就是为了记住......记住这个分析的逻辑

2、初步分析

  根据这个特殊值,进行了多次测试,发现不同的密码,其va内容不一样,且不随ip,时间戳等参数变化,故推断,该参数与密码有关系。通过js文件查找,找到了一个“LoginAction.js”,从文件名就能看出来,这个js文件主要的功能就是在登录时执行的脚本,通过关键字搜索,发现如下代码:

 data.field['va'] = AesEncrypt(data.field['LoginUserPassword']);
    data.field['LoginUserPassword'] = $.md5(data.field['LoginUserPassword']);
    $.ajax({
        url: '/RegistLogin/Login',
        data: data.field,
        type: 'post',
        dataType: 'json',
        beforeSend: function() {
            loadding();
        },
        complete: function() {
            loaddingClose();
        },

  很明确了,关键参数va的来源已经找出来了,就是aes的一个加密行为,该加密函数,在另外一个js文件中,

data.field['va'] = AesEncrypt(data.field['LoginUserPassword']);

3、JS重构

  aes加密的函数就是来源于这个包“cryptojs.min.js”,通过格式化可以找到其加密函数,但是吧,这种编译后的js文件重构起来挺费劲,格式化了一下,查看了相关内容,因为是aes加密,所以加密模式很重要,通过阅读源码,以及aes在线测试获得了以下内容:

加密模式:CBC
加密秘钥:zlfnewpwdencryptkeyaesabcpkjhcpj
偏 移 量:zlfnewpwdencrypt
填充模式:pkcs7
数 据 块: 128bit  测试出来的,128bit 偏移量最小是16bit

  知道这些内容,用python就可以写出来了

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad


class AesEncrypt:

    @staticmethod
    def encrypt(pwd='admin'):
        aes = AES.new(
            key='zlfnewpwdencryptkeyaesabcpkjhcpj'.encode('utf-8'), # 秘钥
            mode=AES.MODE_CBC,
            iv=b'zlfnewpwdencrypt' # 偏移量
        )
        pad_pwd = pad(pwd.encode('utf-8'), AES.block_size, style='pkcs7')  # pkcs7补全
        return str(base64.encodebytes(aes.encrypt(pad_pwd)), encoding='utf-8').strip()

4、附ECB模式加密

  这是另外一个站点ECB模式的加密,在此记录一下

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad


class DfLogin:
    def __init__(self):
        pass

    @staticmethod
    def encrypt(pwd='123456', key='1111222233334444'):
        aes = AES.new(key.encode('utf-8'), AES.MODE_ECB)
        pad_pwd = pad(pwd.encode('utf-8'), AES.block_size, style='pkcs7')  # pkcs7补全
        return str(base64.encodebytes(aes.encrypt(pad_pwd)), encoding='utf-8').strip()

5、附ECB模式加密

  虽然很简单吧,但是怎么说呢,平常咱研究aes还是比较少的,遇见这种登录的情况吧,很多就不去深入研究一下,感觉没有必要浪费时间,但是吧针对大规模的采集行为,这种加密研究还是有必要的,你会,他会,不如自己会......这篇文章仅仅用来记录....

Robin.Liu

三千大千世界,即非世界,是名世界

友情链接

苏ICP备18038860号

Copyright © sogemao.com 版权所有 Robin.Liu