Chrome/Edge v20版本Cookie AES解密失败问题求助
核心问题根源
Chrome 127升级到Cookie V20加密标准后,解密逻辑未适配以下关键变化,导致解密后字节流无法通过UTF-8解码:
- 加密模式从AES-CBC改为AES-GCM
- Cookie格式新增版本标识、HMAC校验字段
- 密钥派生的信息字段从
v10改为v20
具体问题点拆解
格式解析错误
V20的Cookie结构为v20|<版本字节>|<base64编码IV>|<base64编码加密数据>|<base64编码HMAC>,若仍按V10的v10|<IV>|<加密数据>格式切割,会把HMAC校验字节混入解密数据,导致解密结果包含无效UTF-8字节,触发'utf-8' codec can't decode byte 0xf0...错误。加密模式不匹配
V10使用AES-CBC+PKCS#7填充,V20改用AES-GCM(带认证标签的加密模式)。如果代码仍用CBC模式解密,结果必然是乱码,无法转成有效字符串。密钥派生逻辑未更新
V20的密钥派生使用HKDF-SHA256,信息字段固定为v20,若仍用V10的v10信息字段派生密钥,解密时会用错误密钥导致结果乱码。
修复步骤
1. 适配V20格式解析
import base64 def parse_v20_cookie(cookie_str): parts = cookie_str.split('|') if parts[0] != 'v20': return None, None # 非V20格式直接返回 # 提取IV和加密数据并解码 iv = base64.b64decode(parts[2]) encrypted_data = base64.b64decode(parts[3]) # HMAC字段用于校验,无需传入解密流程 return iv, encrypted_data
2. 更新为AES-GCM解密逻辑
V20的加密数据包含密文+16字节GCM认证标签,需拆分后解密:
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend def decrypt_aes_gcm(key, iv, encrypted_data): # 拆分密文和GCM认证标签(最后16字节) ciphertext = encrypted_data[:-16] tag = encrypted_data[-16:] cipher = Cipher(algorithms.AES(key), modes.GCM(iv, tag), backend=default_backend()) decryptor = cipher.decryptor() return decryptor.update(ciphertext) + decryptor.finalize()
3. 修正密钥派生逻辑
import hashlib from cryptography.hazmat.primitives.kdf.hkdf import HKDF def derive_v20_key(master_key): hkdf = HKDF( algorithm=hashlib.sha256(), length=32, salt=b'saltysalt', info=b'v20', # 关键:V20专属信息字段 ) return hkdf.derive(master_key)
4. 完整解密流程示例
# 假设已提取到Chrome的master_key和目标Cookie值 master_key = b"<你的master_key字节>" cookie_value = "v20|1|<base64_iv>|<base64_encrypted_data>|<base64_hmac>" iv, encrypted_data = parse_v20_cookie(cookie_value) v20_key = derive_v20_key(master_key) decrypted_bytes = decrypt_aes_gcm(v20_key, iv, encrypted_data) # AES-GCM解密结果无填充,直接转UTF-8 decrypted_str = decrypted_bytes.decode('utf-8')
内容的提问来源于stack exchange,提问作者Dhuruvan
相关产品推荐
相关产品推荐

