简介:本文深入解析百度指数Cipher-Text与百度翻译Acs-Token的逆向分析过程,揭示其加密机制与Token生成逻辑,为开发者提供技术参考与安全防护建议。
在互联网数据采集与API调用场景中,百度指数的Cipher-Text加密参数和百度翻译的Acs-Token鉴权机制是开发者常遇到的两大技术挑战。本文通过逆向分析其加密算法、参数生成逻辑及网络通信协议,揭示两者底层实现原理,并提供可复用的技术方案与安全防护建议。
百度指数的Cipher-Text参数主要用于保护查询关键词的隐私性,防止明文传输导致的数据泄露。在用户发起指数查询请求时,前端会对关键词进行加密处理,生成Cipher-Text后提交至服务器。
通过浏览器开发者工具(F12)的Network面板,捕获指数查询请求的XHR请求,定位到包含Cipher-Text的POST请求体。示例请求如下:
POST /api/trend/index HTTP/1.1Host: index.baidu.comContent-Type: application/x-www-form-urlencodedwd=Cipher-Text%3D加密值&...
在浏览器控制台(Console)中,通过断点调试(debugger)或事件监听(performance.timing)定位加密函数。发现加密逻辑位于/static/index.js的encryptKeyword方法中,其核心逻辑为:
function encryptKeyword(keyword) {const salt = "固定盐值"; // 示例值,实际动态生成const encrypted = CryptoJS.AES.encrypt(keyword, salt, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}).toString();return encodeURIComponent(encrypted);}
通过动态分析发现,盐值(salt)并非固定值,而是由前端动态生成并嵌入页面中。进一步追踪发现,盐值通过以下方式生成:
function generateSalt() {return Date.now().toString(16) + Math.random().toString(36).substr(2);}
加密模式为AES-ECB,填充方式为PKCS#7,与标准AES加密一致。
使用Node.js复现加密逻辑:
const CryptoJS = require("crypto-js");function encrypt(keyword) {const salt = generateSalt(); // 需动态获取实际盐值const encrypted = CryptoJS.AES.encrypt(keyword, salt, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}).toString();return encodeURIComponent(encrypted);}// 对比浏览器生成的Cipher-Text与本地生成值console.log(encrypt("测试关键词"));
通过对比浏览器生成的Cipher-Text与本地复现结果,验证加密逻辑的正确性。
百度翻译API通过Acs-Token实现请求鉴权,防止未授权访问。Token生成涉及时间戳、签名算法及动态密钥,其流程如下:
通过Fiddler或Wireshark捕获翻译API请求,定位到包含Acs-Token的Authorization头:
GET /api/trans/vip/translate HTTP/1.1Host: api.fanyi.baidu.comAuthorization: Acs-Token 签名值
在前端代码中搜索HMAC-SHA256或crypto.subtle相关调用,发现签名逻辑位于/static/translate.js的generateToken方法:
async function generateToken(appid, key, query) {const timestamp = Date.now().toString();const nonce = Math.random().toString(36).substr(2, 8);const stringToSign = `${appid}${timestamp}${nonce}${query}`;const encoder = new TextEncoder();const data = encoder.encode(stringToSign);const cryptoKey = await crypto.subtle.importKey("raw",encoder.encode(key),{ name: "HMAC", hash: "SHA-256" },false,["sign"]);const signature = await crypto.subtle.sign("HMAC",cryptoKey,data);const hashArray = Array.from(new Uint8Array(signature));const hashHex = hashArray.map(b => b.toString(16).padStart(2, "0")).join("");return `${appid}:${timestamp}:${nonce}:${hashHex}`;}
通过动态分析发现,密钥(key)由后端动态下发至前端,存储在window.__SECRET_KEY__变量中。实际调用时需替换为真实密钥。
使用Python复现签名逻辑:
import hmacimport hashlibimport timeimport randomimport base64def generate_token(appid, key, query):timestamp = str(int(time.time()))nonce = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=8))string_to_sign = f"{appid}{timestamp}{nonce}{query}"signature = hmac.new(key.encode('utf-8'),string_to_sign.encode('utf-8'),hashlib.sha256).digest()token = f"{appid}:{timestamp}:{nonce}:{signature.hex()}"return token# 对比浏览器生成的Acs-Token与本地生成值print(generate_token("测试APPID", "测试KEY", "hello"))
通过对比浏览器生成的Acs-Token与本地复现结果,验证签名逻辑的正确性。
本文通过逆向分析百度指数的Cipher-Text加密和百度翻译的Acs-Token鉴权机制,揭示了其底层实现原理。开发者在集成相关API时,应遵循以下原则:
未来研究可进一步探索:
通过技术逆向与安全实践的结合,开发者能够更高效、安全地集成第三方服务,同时提升系统的鲁棒性。