response body加密如何破解方法详解

 更新时间:2023年01月11日 10:24:30   作者:程序媛最可爱  
这篇文章主要为大家介绍了response body加密如何破解的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

最近听了一个 web 安全的分享,其中提到了响应加密,我去看了下是怎么实现的,于是就有了这篇文章。

见过账号密码加密,没见过响应体加密吧? 打开控制台的 response,吓了一跳:

截屏2023-01-06 下午2.46.41.png

咦,响应不是 json,这还是第一次见。先别着急,既然只能看见字符串,说明是对整个响应体加密的,那么解密一定是在前端。 哈哈,只要是前端解密,作为一个老前端,还能难得倒我?
看我怎么取密钥

取密钥

既然是响应体统一的加密,那解密函数大概率在响应拦截器里。

添加 fetch breakpoints
devtools -> sources -> XHR/fetch Breakpoints -> +
对指定的 url 添加断点

一路 debug 发现密文是在 xhr.onReadyStateChange 函数里解密的。这里找到了加密方法是对称加密 AES192 以及对称加密密钥 key_string:

!(function (t) {
  var e = c.createDecipher("aes192", "key_string"),
    a = e.update(t.data, "hex", "utf8");
  (a += e.final("utf8")), (a = JSON.parse(a)), (t.data = a);
})(t);

yes,是不是很容易就破解啦?

解密

本地模拟解密 根据上一个步骤的加密方法和密钥,启动一个 node 服务,来模拟客户端和服务端,让我们来看看是否解密正常,以及 NetWork 中的展示是否一致

初始化一个 egg 工程,简单的改造一下。

$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i
$ npm run dev
$ open http://localhost:7001

添加两个 controller:

加密接口

// http://127.0.0.1:7001/encode
// 加密
const encrypt = require("./../../encrypt");
const { Controller } = require("egg");
class HomeController extends Controller {
  async index() {
    const { ctx } = this;
    ctx.body = encrypt.aes192_encode(ctx.query.data);
  }
}
module.exports = HomeController;

解密接口

// http://127.0.0.1:7001/decode
// 解密
const encrypt = require("./../../encrypt");
const { Controller } = require("egg");
class HomeController extends Controller {
  async index() {
    const { ctx } = this;
    ctx.body = encrypt.aes192_decode(ctx.query.data);
  }
}
module.exports = HomeController;

添加加解密方法:

const crypto = require("crypto");
function aes192_encode(text, key) {
  const cipher = crypto.createCipher("aes192", key);
  let crypted = cipher.update(text + "", "utf8", "hex");
  crypted += cipher.final("hex"); // 加密之后的值
  return crypted;
}
function aes192_decode(message, key) {
  const decipher = crypto.createDecipher("aes192", key);
  let dec = decipher.update(message, "hex", "utf8");
  dec += decipher.final("utf8"); // 解密之后的值
  return dec;
}
module.exports = { aes192_encode, aes192_decode };

修改 router.js

"use strict";
/**
 * @param {Egg.Application} app - egg application
 */
module.exports = (app) => {
  const { router, controller } = app;
  router.get("/", controller.home.index);
  router.get("/encode", controller.encode.index);
  router.get("/decode", controller.decode.index);
};

在浏览器访问 http://127.0.0.1:7001/encode?data=abc控制台 response 返回 62ff5059fd64c139378f1a370a09ad02

在浏览器访问 http://127.0.0.1:7001/decode?data=62ff5059fd64c139378f1a370a09ad02 控制台 response 返回 abc

把我们目标网站的响应体拿来试试,结果也是直接就解出来啦!

考虑到启动一个 node 服务还是有点麻烦,我们直接在控制台安装对应的 npm 包,直接在控制台解密。

如何在控制台安装 npm 包?

安装 chrome 插件 console importor 安装好之后 在控制台输入:

$i("package name");

这里我们安装 crypto 试试

$i("crypto")
importer.js:2 [$i]: Searching for crypto, please be patient...
importer.js:2 [$i]: crypto not found, import crypto-js instead.
importer.js:2 [$i]: crypto-js is loading, please be patient...
importer.js:2 [$i]: crypto-js(https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js) is loaded.
importer.js:2 [$i]: The new global variables are as follows: CryptoJS . Maybe you can use them.

控制台安装 crypto 找不到, 自动安装了 cryptojs, 道理是一样的

// Encrypt
var ciphertext = CryptoJS.AES.encrypt("data", "key_string").toString();
// Decrypt
var bytes = CryptoJS.AES.decrypt(ciphertext, "key_string");
var originalText = bytes.toString(CryptoJS.enc.Utf8);

到这里我们就可以直接在控制台解密响应体啦,如果大家感兴趣的话,可以自己写一个响应拦截器插件,可以对指定接口解密,这样的话,线上环境也能够排查 response 啦!

加密响应体有必要?

现在回到文章开头,想想加密响应体有没有价值?
能拿到响应体肯定是拥有登录令牌的,既然都能正常访问页面了,那么对响应加密其实意义不太大,反而增加了开发人员排查问题的成本。如果是为了防止抓包信息泄露,使用 https 后抓包拿到的数据已经是加密过且不能破解的。(可能想得不全面,欢迎大家讨论)

最后

密钥只要是放在前端,无论怎么做代码混淆,一定是有办法解密的,差别在于时间长短。

以上就是response body加密如何破解方法详解的详细内容,更多关于response body加密破解的资料请关注脚本之家其它相关文章!

相关文章

  • JS版的date函数(和PHP的date函数一样)

    JS版的date函数(和PHP的date函数一样)

    这篇文章主要介绍了JS版的date函数,使用方法和PHP的date函数一样,需要的朋友可以参考下
    2014-05-05
  • 详解如何在 JavaScript中使用媒体查询

    详解如何在 JavaScript中使用媒体查询

    这篇文章主要为大家介绍了详解如何在 JavaScript中使用媒体查询,<BR>有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 使用 render 函数封装高扩展的组件

    使用 render 函数封装高扩展的组件

    这篇文章主要介绍了使用 render 函数封装高扩展的组件,vue 官网给出的 render 函数的例子只能体现 render 函数的优雅的一方面,却不能看出其扩展性,今天就来封装一个体现其扩展性的组件,需要的朋友可以参考一下
    2021-12-12
  • umi插件开发仿dumi项目实现markdown文件转为页面

    umi插件开发仿dumi项目实现markdown文件转为页面

    这篇文章主要介绍了umi插件开发仿dumi项目实现markdown文件转为页面方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • vue axios请求超时的正确处理方法

    vue axios请求超时的正确处理方法

    这篇文章主要介绍了vue axios请求超时,设置重新请求的完美解决方法,一并给大家介绍了axios基本用法,需要的朋友可以参考下
    2018-04-04
  • AntDesignPro使用electron构建桌面应用示例详解

    AntDesignPro使用electron构建桌面应用示例详解

    这篇文章主要为大家介绍了AntDesignPro使用electron构建桌面应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • JavaScript基本语法讲解

    JavaScript基本语法讲解

    这篇文章主要介绍了JavaScript的基本语法,包括注释和书写格式等基本知识,需要的朋友可以参考下
    2015-06-06
  • JS 4个超级实用的小技巧 提升开发效率

    JS 4个超级实用的小技巧 提升开发效率

    JS有很多小技巧可以使代码更精简、更简单。今天主要分享4个技巧,在平时的工作中可以大大的缩短代码量和开发时间。,需要的朋友可以参考下面文章内容哟
    2021-09-09
  • JavaScript 执行上下文的视角详解this使用

    JavaScript 执行上下文的视角详解this使用

    这篇文章主要为以JavaScript 执行上下文的视角为大家讲清楚 this使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • JavaScript数组 几个常用方法总结

    JavaScript数组 几个常用方法总结

    这篇文章主要介绍了JavaScript数组 几个常用方法,主要概述的方法有filter()、map()、sort()、reduce()、forEach(),这些方法都是JavaScript常用到的方法,下面文章内容详细介绍了他们的语法、参数、返回值等资料,需要的朋友可以参考一下
    2021-11-11

最新评论