起源
今天看到了这个视频,大致讲的是谷歌自动存储的密码是放在本地的,但是以密文的方式存储,加密方式是 AES-256 in GCM mode,但是密钥也存储在本地,也就是说可以手动完成解密(虽然没什么用),对于学过一点点密码学的人,还是比较感兴趣的
参考
- Chrome 浏览器 Cookies 提取和解密(给了主体代码,用于解密)
- 如何在谷歌浏览器中恢复保存的密码(提供了补充)
- 该视频的评论区
第二篇文章提供了一些补充:
① 密码存储的位置是 "C:\Users\xxx\AppData\Local\Google\Chrome\User Data\Default\Login Data"
,实际上它是一个数据库文件
② 密钥存储的位置是 "C:\Users\xxx\AppData\Local\Google\Chrome\User Data\Local State"
,其内容的 encrypted_key
就是密钥
③ 这个数据库文件的类型是 sqlite,表中的属性如下(可用 Navicat Premium 查看)
origin_url - 网站的主要链接
action_url - 网站的登录链接
username_element - 网站中用户名字段的名称
username_value - 用于登录的用户名
password_element - 网站中密码字段的名称
password_value - 用于登录的密码(加密)
date_created - 存储日期
times_used - 使用此密码的次数
blacklisted_by_user - 设置为 1 意味着永远不会存储密码
评论区也对视频进行了一些补充:
① 如果黑客要使用脚本进行破解,必然要有权限(因为文件放在APPData
文件夹下),但如果有权限,那说明电脑本身是不安全的,那也就没必要只关注谷歌浏览器的密码了,因为整个电脑都已经被黑客操控了
② GitHub 代码库的私钥,包括很多隐私数据同样是存储在电脑中
③ 如果需要二次保护,可以用 1Password 等软件包含密码
代码
我用的是 Python 实现,主要参考了这篇文章的代码
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
# @Author: Xiaotuan
import sqlite3
import base64
import win32crypt
from Cryptodome.Cipher import AES
encrypted_key = b"RFBBUEkBxxxxxx" # 密钥
encrypted_key = base64.b64decode(encrypted_key) # base64 解密
encrypted_key = encrypted_key[5:] # 去掉象征意义的符号 DPAPI
decrypted_key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None,0)[1] # CryptProtectData 是 Windows 的一种加密方式
# 至此才是真正的密钥,32 位
con = sqlite3.connect("chrome") # 连接 sqlite 数据库文件
cur = con.cursor()
cursor = cur.execute(
"SELECT id, origin_url, username_value, password_value from logins"
) # 获取表中属性的数据
for row in cursor:
print("ID = ", row[0])
print("origin_url = ", row[1]) # 网站的主要链接
print("username_value = ", row[2]) # 用于登录的用户名
data = row[3]
nonce = data[3:3 + 12]
ciphertext = data[3 + 12:-16]
tag = data[-16:]
cipher = AES.new(decrypted_key, AES.MODE_GCM, nonce=nonce) # AES-256 in GCM mode
plaintext = cipher.decrypt_and_verify(ciphertext, tag)
print("password_value = ", plaintext.decode('utf-8'), "\n") # 用于登录的密码
print("数据操作成功")
con.close()
![](/i/l/?n=23&i=blog/1827910/202212/1827910-20221201142830097-708275925.png)