JavaScript逆向工程:如何判断对称加密与非对称加密

在现代Web应用安全分析中,加密算法的识别是JavaScript逆向工程的关键环节。本文将详细介绍如何在逆向工程中判断JavaScript代码使用的是对称加密还是非对称加密。

一、加密算法基础概念

1. 对称加密 (Symmetric Encryption)

  • 特点:加密和解密使用相同的密钥

  • 常见算法:AES、DES、3DES、RC4、Blowfish

  • 优点:加解密速度快,适合大数据量加密

  • 缺点:密钥分发困难

2. 非对称加密 (Asymmetric Encryption)

  • 特点:使用公钥加密,私钥解密(或反之)

  • 常见算法:RSA、ECC、ElGamal、DSA

  • 优点:安全性高,无需共享密钥

  • 缺点:加解密速度慢,不适合大数据量

二、识别加密类型的关键指标

1. 密钥特征识别法

// 对称加密特征 - 通常只有一个密钥
const key = "abcdef1234567890"; // 固定长度的密钥
const iv = "1234567890abcdef";  // 初始化向量(IV)// 非对称加密特征 - 明显区分公钥和私钥
const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...`;
const privateKey = `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAA...`;

判断要点

  • 对称加密:通常有1个密钥+可能的IV

  • 非对称加密:成对出现的公钥/私钥,结构明显(PEM格式)

2. 加密函数调用识别法

对称加密常见模式:
// AES加密典型调用
const encrypted = CryptoJS.AES.encrypt("plaintext", key, { iv: iv, mode: CryptoJS.mode.CBC }
).toString();
非对称加密常见模式:
// RSA加密典型调用
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
const encrypted = encrypt.encrypt("plaintext");

判断要点

  • 对称加密:通常直接使用密钥进行加密

  • 非对称加密:需要先设置公钥/私钥

3. 密钥长度识别法

// 对称加密密钥长度
const aesKey = "0123456789abcdef"; // 16字节(128位)
const desKey = "abcdefgh";        // 8字节(64位)// 非对称加密密钥长度
const rsaKey = `-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAx3j6...`; // 通常1024/2048位

判断要点

  • 对称加密:密钥长度固定(AES:128/192/256位)

  • 非对称加密:密钥长度较长(RSA通常≥1024位)

三、实战识别步骤

步骤1:搜索加密关键词

在代码中搜索以下关键词:

// 通用关键词
encrypt, decrypt, cipher, crypto, encode, decode// 对称加密关键词
AES, DES, 3DES, RC4, Blowfish, 
CBC, ECB, CFB, OFB, CTR, GCM, // 加密模式
iv, initializationVector, salt, // 相关参数// 非对称加密关键词
RSA, ECC, ElGamal, DSA, 
publicKey, privateKey, 
sign, verify, // 签名相关
-----BEGIN (PUBLIC|PRIVATE) KEY-----

步骤2:分析加密库使用

常见加密库特征:
  1. 对称加密库

    • CryptoJS (常见AES实现)

    • sjcl (斯坦福JS加密库)

    • WebCrypto API (现代浏览器内置)

  2. 非对称加密库

    • JSEncrypt (RSA实现)

    • forge (多种算法支持)

    • node-rsa (Node.js环境)

识别示例

// 如果看到这些初始化,很可能是非对称加密
const crypt = new JSEncrypt();
const rsa = new RSAKey();// 如果看到这些,很可能是对称加密
const encrypted = CryptoJS.AES.encrypt(...);
const cipher = forge.cipher.createCipher('AES-CBC', key);

步骤3:跟踪密钥来源

// 对称加密密钥通常:
// 1. 硬编码在代码中
// 2. 从服务器获取
// 3. 通过密钥派生函数(PBKDF2)生成// 非对称加密密钥通常:
// 1. 以PEM格式存储
// 2. 通过证书加载
// 3. 动态生成(如RSA密钥对)

四、典型案例分析

案例1:对称加密识别

// 典型AES加密实现
function encryptData(data) {const key = CryptoJS.enc.Utf8.parse("1234567890abcdef");const iv = CryptoJS.enc.Utf8.parse("abcdef1234567890");const encrypted = CryptoJS.AES.encrypt(data, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return encrypted.toString();
}

识别特征

  • 使用CryptoJS库

  • 明确的key和iv

  • 指定了加密模式(CBC)和填充方式(Pkcs7)

  • 单一密钥

案例2:非对称加密识别

// 典型RSA加密实现
function rsaEncrypt(data) {const encryptor = new JSEncrypt();encryptor.setPublicKey(`-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz6XQhVj7JY...-----END PUBLIC KEY-----`);return encryptor.encrypt(data);
}

识别特征

  • 使用JSEncrypt库

  • 明显的PEM格式公钥

  • 设置公钥后加密

  • 没有对称加密的iv参数

五、进阶识别技巧

1. 加密模式识别

// 对称加密常见模式特征
{mode: CryptoJS.mode.CBC,  // 需要IVmode: CryptoJS.mode.ECB,  // 不需要IVmode: CryptoJS.mode.GCM   // 认证加密
}// 非对称加密通常不指定模式

2. 加密操作上下文分析

  • 对称加密常见场景:

    • 大量数据加密

    • 通信内容加密

    • 本地存储加密

  • 非对称加密常见场景:

    • 密钥交换

    • 数字签名

    • 小数据量加密

3. 性能特征分析

// 非对称加密通常只加密小块数据
rsaEncrypt(JSON.stringify({ token: "abc123" }));// 对称加密可能加密大量数据
aesEncrypt(largeFileContent);

六、工具辅助识别

1. Chrome开发者工具

  • 在Sources面板搜索加密关键词

  • 使用XHR断点捕获加密请求

2. Frida动态插桩

// 监控CryptoJS调用
Interceptor.attach(Module.findExportByName("libcrypto.so", "AES_encrypt"), {onEnter: function(args) {console.log("AES加密调用 detected");}
});

3. Burp Suite观察

  • 观察请求特征:

    • 对称加密:数据长度与明文成比例

    • 非对称加密:固定长度输出(如RSA 2048位总是256字节)

七、总结判断流程图

graph TDA[发现加密代码] --> B{有公钥/私钥?}B -->|是| C[非对称加密]B -->|否| D{单一密钥+IV?}D -->|是| E[对称加密]D -->|否| F[可能是哈希或其它]

快速判断口诀

  • 一钥加解是对称

  • 公私分明非对称

  • 密钥较短是对称

  • PEM格式非对称

  • 模式IV是对称

  • 签名必是非对称

掌握这些识别技巧,你就能在JavaScript逆向工程中快速判断出使用的是对称加密还是非对称加密算法,为后续的深入分析打下基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物理备份工具 BRM vs gs_probackup

什么是BRM 上一篇文章讲了openGauss的物理备份工具gs_probackup,今天来说说BRM备份工具。 BRM备份恢复工具全称为:Backup and Recovery Manager,是MogDB基于opengauss的备份工具 gs_probackup 做了一些封装和优化,面向MogDB数据库实现备份和…

问问lua怎么写DeepSeek,,,,,

很坦白说,这十年,我几乎没办法从互联网找到这个这样的代码,互联网引擎找不到,我也没有很大的“追求”要传承,或者要宣传什么;直到DeepSeek的出现 兄弟,Deepseek现在已经比你更了解你楼下的超市…

react+Tesseract.js实现前端拍照获取/选择文件等文字识别OCR

需求背景 在开发过程中可能会存在用户上传一张图片后下方需要自己识别出来文字数字等信息,有的时候会通过后端来识别后返回,但是也会存在纯前端去识别的情况,这个时候就需要使用到Tesseract.js这个库了 附Tesseract.js官方(htt…

蓝桥杯考前复盘

明天就是考试了,适当的停下刷题的步伐。 静静回望、思考、总结一下,我走过的步伐。 考试不是结束,他只是检测这一段时间学习成果的工具。 该继续走的路,还是要继续走的。 只是最近,我偶尔会感到迷惘,看…

前端-Vue3

1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…

[ctfshow web入门] web39

信息收集 题目发生了微妙的变化,只过滤flag,include后固定跟上了.php。且没有了echo $flag;,虽说本来就没什么用 if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag/i", $c)){include($c.".php");} }else{…

【动手学深度学习】LeNet:卷积神经网络的开山之作

【动手学深度学习】LeNet:卷积神经网络的开山之作 1,LeNet卷积神经网络简介2,Fashion-MNIST图像分类数据集3,LeNet总体架构4,LeNet代码实现4.1,定义LeNet模型4.2,定义模型评估函数4.3&#xff0…

代码随想录第15天:(二叉树)

一、二叉搜索树的最小绝对差(Leetcode 530) 思路1 :中序遍历将二叉树转化为有序数组,然后暴力求解。 class Solution:def __init__(self):# 初始化一个空的列表,用于保存树的节点值self.vec []def traversal(self, r…

计算机操作系统-【死锁】

文章目录 一、什么是死锁?死锁产生的原因?死锁产生的必要条件?互斥条件请求并保持不可剥夺环路等待 二、处理死锁的基本方法死锁的预防摒弃请求和保持条件摒弃不可剥夺条件摒弃环路等待条件 死锁的避免银行家算法案例 提示:以下是…

vue拓扑图组件

vue拓扑图组件 介绍技术栈功能特性快速开始安装依赖开发调试构建部署 使用示例演示截图组件源码 介绍 一个基于 Vue3 的拓扑图组件,具有以下特点: 1.基于 vue-flow 实现,提供流畅的拓扑图展示体验 2.支持传入 JSON 对象自动生成拓扑结构 3.自…

go 通过汇编分析函数传参与返回值机制

文章目录 概要一、前置知识二、汇编分析2.1、示例2.2、汇编2.2.1、 寄存器传值的汇编2.2.2、 栈内存传值的汇编 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中,我们研究了go函数调用时的栈布…

python-1. 找单独的数

问题描述 在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。 要求: 设…

算法学习C++需注意的基本知识

文章目录 01_算法中C需注意的基本知识cmath头文件一些计算符ASCII码表数据类型长度运算符cout固定输出格式浮点数的比较max排序自定义类型字符的大小写转换与判断判断字符是数字还是字母 02_数据结构需要注意的内容1.stringgetline函数的使用string::findsubstr截取字符串strin…

从零开始写android 的智能指针

Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),源码中的位置在system/core/include/utils/StrongPointer.h。另外一种是弱指针(weak pointer)。其实称之为强引用和弱引用更合适一些。强…

【leetcode hot 100 152】乘积最大子数组

错误解法:db[i]表示以i结尾的最大的非空连续,动态规划:dp[i] Math.max(nums[i], nums[i] * dp[i - 1]); class Solution {public int maxProduct(int[] nums) {int n nums.length;int[] dp new int[n]; // db[i]表示以i结尾的最大的非空连…

图论整理复习

回溯: 模板: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯&#xff…

uniapp离线打包提示未添加videoplayer模块

uniapp中使用到video标签,但是离线打包放到安卓工程中,运行到真机中时提示如下: 解决方案: 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档:https://nativesupport.dcloud.net.cn/…

打包构建替换App名称

方案适用背景 一套代码出多个安装包,且安装包的应用名称、图标都不一样考虑三语名称问题 通过 Gradle 脚本实现 gradle.properties 里面定义标识来区分应用,如下文里的 APP_TYPEAAA 、APP_TYPEBBB// 定义 groovy 替换方法 def replaceAppName(String …

DrissionPage移动端自动化:从H5到原生App的跨界测试

一、移动端自动化测试的挑战与机遇 移动端测试面临多维度挑战: 设备碎片化:Android/iOS版本、屏幕分辨率差异 混合应用架构:H5页面与原生组件的深度耦合 交互复杂性:多点触控、手势操作、传感器模拟 性能监控:内存…

达梦数据库用函数实现身份证合法校验

达梦数据库用函数实现身份证合法校验 拿走不谢~ CREATE OR REPLACE FUNCTION CHECK_IDCARD(A_SFZ IN VARCHAR2) RETURN VARCHAR2 IS TYPE WEIGHT_TAB IS VARRAY(17) OF NUMBER; TYPE CHECK_TAB IS VARRAY(11) OF CHAR; WEIGHT_FACTOR WEIGHT_TAB : WEIGHT_TAB(7,9,10,5,8,4,…