谷歌浏览器自动保存密码的解密

起源

今天看到了这个视频,大致讲的是谷歌自动存储的密码是放在本地的,但是以密文的方式存储,加密方式是 AES-256 in GCM mode,但是密钥也存储在本地,也就是说可以手动完成解密(虽然没什么用),对于学过一点点密码学的人,还是比较感兴趣的

参考

第二篇文章提供了一些补充:
① 密码存储的位置是 "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()
posted @ 2022-12-01 14:30  筱团  阅读(4715)  评论(0编辑  收藏  举报