某站点登陆密码AES加密分析

1、前言

  今天接触了一个站点,登录密码加密了...让我的爆破模块无法正常输入密码了,这就让我有点不高兴了!!!正常情况下,为了网络安全是需要对密码进行加密的,但是现实生活中还是有很多很多的站点,在提交密码的时候依旧是明文,这时候抓包就能看见明文...既然密码不是明文,那我就开始研究研究吧,反正是js加解密,加密方式肯定存在本地,而且是明文加密方式,说干就干吧。

2、加密判断

  通过浏览器我们可以看见下面传递账号密码的数据:

loginName: "******"
password: "qatiiOFk1CwfiSgm8gp67g==   # 123456

  我一看密码这块就知道是编码过的,再看看“==”第一猜测就是base64,然后去测试了一下,结果显而易见,肯定不是base64编码的。既然如此我那我就去网页源码那块去找吧,chrome全局搜索,passsword,发现很多js都有这个关键字,然后全部大致看了一下,发现“appStore.js”很符合我的需求哦,他的代码就是下面这段,他调用了aes的某个自定义的加密模块,他还暴露了这个加密秘钥:“1111222233334444”。

loginForm.password = AESEncrypt(loginForm.password, '1111222233334444')

  于是我就顺藤摸瓜,通过appStore.js的导包,找到了Utiles.js,找到了这个加密模块:

# appStore.js 导包
import { AESEncrypt } from '../utils/Utils'

# utils.js 中的函数方法
export function AESEncrypt(data,key) {
    let AES_KEY = CryptoJS.enc.Utf8.parse(key);
    let sendData = CryptoJS.enc.Utf8.parse(data);
    let encrypted = CryptoJS.AES.encrypt(sendData, AES_KEY,{mode:CryptoJS.mode.ECB,padding:CryptoJS.pad.Pkcs7});
    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}

  那么到此我就基本确定了,这个密码加密是通过aes加密,采用“ECB”加密模式,秘钥“1111222233334444”,那下一步,我就开始照着上面这个加密函数编写一个python版供我使用了;

3、模块编写

  按照目前手上有的参数,秘钥,密码,然后模式,那就开始写,

import base64
from Crypto.Cipher import AES


def encrypt(pwd='123456', key='1111222233334444'):
    model = AES.MODE_ECB
    byte_pwd = str(pwd).encode() + b'\x00' * ((16 - len(str(pwd)) % 16) % 16)
    aes = AES.new(key.encode('utf-8'), model)
    return base64.encodebytes(aes.encrypt(byte_pwd)).decode('utf8').strip()


if __name__ == '__main__':
    print('明文:123456', '密文:{}'.format(encrypt()))
# 实际输出    明文:123456 密文:1BiBYg5Jw5ebZI7Dc6h/+Q==
# 目标输出    明文:123456 密文:qatiiOFk1CwfiSgm8gp67g==

  写的很好看哈,很轻松,但是输出加密内容后,傻眼了???啥鬼?为啥不一样呢????正常情况下不应该一样吗???研究了半天,也没有弄明白,在细看js源码发现一个重要的参数“padding:CryptoJS.pad.Pkcs7”“这pkcs7做啥的??没用的话不应该写在这里呀,肯定是有用的,于是开始百度百度,发现这个是用来填充的,我琢磨着,我也填充了呀,咋就不对呢???很气人,然后百度了一堆,看到“from Crypto.Util.Padding import pad”这个貌似就可以解决,然后我就导包,tm的不行啊,我的模块不支持啊,后来发现需要安装pycryptodome模块,我又屁颠屁颠的安装了,然后完成以下代码,然后一测试发现很好,good boy~~~

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


def encrypt(pwd='123456', key='1111222233334444'):
    model = AES.MODE_ECB
    aes = AES.new(key.encode('utf-8'), model)
    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()


if __name__ == '__main__':
    print('明文:123456', '密文:{}'.format(encrypt()))

# 实际输出    明文:123456 密文:qatiiOFk1CwfiSgm8gp67g==
# 目标输出    明文:123456 密文:qatiiOFk1CwfiSgm8gp67g==

  那我就就有疑问了,这pkcs7 填充的啥??? 我直接输出“pad_pwd”,他的结果b'123456\n\n\n\n\n\n\n\n\n\n',mmp这里用b'\n'填充的,我操了,我也不了解情况,我把上面的代码b'\x00'改成换行符,也行额,唯一的区别就是,我安装了一个pycryptodome模块...
  研究了差不多两个小时,收获还是有的,涨点知识不容易,一步一步的入坑,然后一步一步爬起来再次入坑......

Robin.Liu

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

友情链接

苏ICP备18038860号

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