Decrypting Chromium cookies(解密 Chromium cookie)
问题描述
我正在尝试在 Python 中使用 Chromium cookie,因为 Chromium 使用 AES(使用 CBC)加密它的 cookie,我需要扭转这一点.
I'm trying to use Chromium cookies in Python, because Chromium encrypts its cookies using AES (with CBC) I need to reverse this.
我可以从 OS X 的钥匙串中恢复 AES 密钥(它存储在 Base 64 中):
I can recover the AES key from OS X's Keychain (it's stored in Base 64):
security find-generic-password -w -a Chrome -s Chrome Safe Storage
# From Python:
python -c 'from subprocess import PIPE, Popen; print(Popen(['security', 'find-generic-password', '-w', '-a', 'Chrome', '-s', 'Chrome Safe Storage'], stdout=PIPE).stdout.read().strip())'
这是我的代码,我所缺少的只是解密 cookie:
Here's the code I have, all I'm missing is decrypting the cookies:
from subprocess import PIPE, Popen
from sqlite3 import dbapi2
def get_encryption_key():
cmd = ['security', 'find-generic-password', '-w', '-a', 'Chrome', '-s', 'Chrome Safe Storage']
return Popen(cmd, stdout=PIPE).stdout.read().strip().decode('base-64')
def get_cookies(database):
key = get_encryption_key()
with dbapi2.connect(database) as conn:
conn.rollback()
rows = conn.cursor().execute('SELECT name, encrypted_value FROM cookies WHERE host_key like ".example.com"')
cookies = {}
for name, enc_val in rows:
val = decrypt(enc_val, key) # magic missing
cookies[name] = val
return cookies
我用 pyCrypto 的 AES 模块尝试了很多东西,但是:
I tried a bunch of things with pyCrypto's AES module but:
- 我没有初始化向量 (IV)
enc_val
不是 16 的倍数
- I have no Initialization Vector (IV)
enc_val
is not a multiple of 16 in length
以下是一些看似有用的链接:
Here are some links that seem useful:
- 开始这一切的提交
- components/encryptor/keychain_password_mac.毫米
- AES 密钥生成(未使用)在 OS X 中,但可以帮助其他人)
- cookie 插入功能
你能帮我解决这个问题吗?
Can you help me figure this out?
推荐答案
您走对了!我已经研究了几天,终于弄明白了.(非常感谢 OP 提供了指向 Chromium 源代码的有用链接.)
You're on the right track! I've been working on this for a few days and finally figured it out. (Many thanks to the OP for the helpful links to the Chromium source.)
我已经发布了一篇帖子,其中包含更多细节和工作脚本,但这里是基本思想:
I've put up a post with a little more detail and a working script, but here is the basic idea:
#! /usr/bin/env python3
from Crypto.Cipher import AES
from Crypto.Protocol.KDF import PBKDF2
# Function to get rid of padding
def clean(x):
return x[:-x[-1]].decode('utf8')
# replace with your encrypted_value from sqlite3
encrypted_value = ENCRYPTED_VALUE
# Trim off the 'v10' that Chrome/ium prepends
encrypted_value = encrypted_value[3:]
# Default values used by both Chrome and Chromium in OSX and Linux
salt = b'saltysalt'
iv = b' ' * 16
length = 16
# On Mac, replace MY_PASS with your password from Keychain
# On Linux, replace MY_PASS with 'peanuts'
my_pass = MY_PASS
my_pass = my_pass.encode('utf8')
# 1003 on Mac, 1 on Linux
iterations = 1003
key = PBKDF2(my_pass, salt, length, iterations)
cipher = AES.new(key, AES.MODE_CBC, IV=iv)
decrypted = cipher.decrypt(encrypted_value)
print(clean(decrypted))
这篇关于解密 Chromium cookie的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:解密 Chromium cookie
基础教程推荐
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01