如何使用Python提取Chrome浏览器保存的密码


Posted in Python onJune 09, 2021

由于Chrome会将大量浏览数据本地保存磁盘中,在本教程中,我们将编写 Python 代码来提取 Windows 计算机上 Chrome 中保存的密码。

首先,让我们安装所需的库:

pip install pycryptodome pypiwin32

打开一个新的 Python 文件,并导入必要的模块:

import os
import json
import base64
import sqlite3
import win32crypt
from Crypto.Cipher import AES
import shutil
from datetime import timezone, datetime, timedelta

在直接进入提取 chrome密码之前,我们需要定义一些有用的函数来帮助我们在主函数中。

def get_chrome_datetime(chromedate):
    """从chrome格式的datetime返回一个`datetime.datetime`对象
因为'chromedate'的格式是1601年1月以来的微秒数"""
    return datetime(1601, 1, 1) + timedelta(microseconds=chromedate)

def get_encryption_key():
    local_state_path = os.path.join(os.environ["USERPROFILE"],"AppData", "Local", "Google", "Chrome","User Data", "Local State")
    with open(local_state_path, "r", encoding="utf-8") as f:
        local_state = f.read()
        local_state = json.loads(local_state)

    # 从Base64解码加密密钥
    key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])
    # 删除 DPAPI str
    key = key[5:]
    # 返回最初加密的解密密钥
    # 使用从当前用户的登录凭据派生的会话密钥
    # 官方文档doc: http://timgolden.me.uk/pywin32-docs/win32crypt.html
    return win32crypt.CryptUnprotectData(key, None, None, None, 0)[1]


def decrypt_password(password, key):
    try:
        # 获取初始化向量
        iv = password[3:15]
        password = password[15:]
        # 生成密码
        cipher = AES.new(key, AES.MODE_GCM, iv)
        # 解密密码
        return cipher.decrypt(password)[:-16].decode()
    except:
        try:
            return str(win32crypt.CryptUnprotectData(password, None, None, None, 0)[1])
        except:
            # not supported
            return ""
  • get_chrome_datetime()函数负责将 chrome 日期格式转换为人类可读的日期时间格式。
  • get_encryption_key()函数提取并解码用于加密密码的AES密钥,这"%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Local State"作为 JSON 文件存储在路径中
  • decrypt_password() 将加密密码和 AES 密钥作为参数,并返回密码的解密版本。

下面是main主要功能:

def main():
    # 获取AES密钥
    key = get_encryption_key()
    # 本地sqlite Chrome数据库路径
    db_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local","Google", "Chrome", "User Data", "default", "Login Data")
    # 将文件复制到其他位置
    # 因为如果chrome当前正在运行,数据库将被锁定
    filename = "ChromeData.db"
    shutil.copyfile(db_path, filename)
    # 连接数据库
    db = sqlite3.connect(filename)
    cursor = db.cursor()
    # 登录表中有我们需要的数据
    cursor.execute("select origin_url, action_url, username_value, password_value, date_created, date_last_used from logins order by date_created")
    # iterate over all rows
    for row in cursor.fetchall():
        origin_url = row[0]
        action_url = row[1]
        username = row[2]
        password = decrypt_password(row[3], key)
        date_created = row[4]
        date_last_used = row[5]        
        if username or password:
            print(f"Origin URL: {origin_url}")
            print(f"Action URL: {action_url}")
            print(f"Username: {username}")
            print(f"Password: {password}")
        else:
            continue
        if date_created != 86400000000 and date_created:
            print(f"Creation date: {str(get_chrome_datetime(date_created))}")
        if date_last_used != 86400000000 and date_last_used:
            print(f"Last Used: {str(get_chrome_datetime(date_last_used))}")
        print("="*50)
    cursor.close()
    db.close()
    try:
        # 尝试删除复制的db文件
        os.remove(filename)
    except:
        pass

首先,我们使用之前定义的get_encryption_key()函数获取加密密钥,然后我们将 sqlite 数据库(位于"%USERPROFILE%\AppData\Local\Google\Chrome\User Data\default\Login Data"保存密码的位置)复制到当前目录并连接到它,这是因为原始数据库文件将被锁定Chrome 当前正在运行。

之后,我们对登录表进行选择查询并遍历所有登录行,我们还解密每个密码date_created并将date_last_used日期时间重新格式化为更易于阅读的格式。

最后,我们打印凭据并从当前目录中删除数据库副本。

让我们调用主函数,完美提取Chrome浏览器保存的密码:

如何使用Python提取Chrome浏览器保存的密码

完整代码

import os
import json
import base64
import sqlite3
import win32crypt
from Crypto.Cipher import AES
import shutil
from datetime import  datetime, timedelta

def get_chrome_datetime(chromedate):
    """从chrome格式的datetime返回一个`datetime.datetime`对象
因为'chromedate'的格式是1601年1月以来的微秒数"""
    return datetime(1601, 1, 1) + timedelta(microseconds=chromedate)

def get_encryption_key():
    local_state_path = os.path.join(os.environ["USERPROFILE"],
                                    "AppData", "Local", "Google", "Chrome",
                                    "User Data", "Local State")
    with open(local_state_path, "r", encoding="utf-8") as f:
        local_state = f.read()
        local_state = json.loads(local_state)

    key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])
   
    key = key[5:]
    
    return win32crypt.CryptUnprotectData(key, None, None, None, 0)[1]


def decrypt_password(password, key):
    try:
        iv = password[3:15]
        password = password[15:]
        cipher = AES.new(key, AES.MODE_GCM, iv)
        return cipher.decrypt(password)[:-16].decode()
    except:
        try:
            return str(win32crypt.CryptUnprotectData(password, None, None, None, 0)[1])
        except:
            # not supported
            return ""


def main():
    key = get_encryption_key()
    db_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local",
                            "Google", "Chrome", "User Data", "default", "Login Data")
    filename = "ChromeData.db"
    shutil.copyfile(db_path, filename)
    db = sqlite3.connect(filename)
    cursor = db.cursor()
    cursor.execute("select origin_url, action_url, username_value, password_value, date_created, date_last_used from logins order by date_created")
    # iterate over all rows
    for row in cursor.fetchall():
        origin_url = row[0]
        action_url = row[1]
        username = row[2]
        password = decrypt_password(row[3], key)
        date_created = row[4]
        date_last_used = row[5]        
        if username or password:
            print(f"Origin URL: {origin_url}")
            print(f"Action URL: {action_url}")
            print(f"Username: {username}")
            print(f"Password: {password}")
        else:
            continue
        if date_created != 86400000000 and date_created:
            print(f"Creation date: {str(get_chrome_datetime(date_created))}")
        if date_last_used != 86400000000 and date_last_used:
            print(f"Last Used: {str(get_chrome_datetime(date_last_used))}")
        print("="*50)

    cursor.close()
    db.close()
    try:
        # try to remove the copied db file
        os.remove(filename)
    except:
        pass


if __name__ == "__main__":
    main()

以上就是教你用Python提取Chrome浏览器保存的密码的详细内容,更多关于Python提取Chrome浏览器保存的密码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python深入学习之特殊方法与多范式
Aug 31 Python
python中os操作文件及文件路径实例汇总
Jan 15 Python
使用Python编写vim插件的简单示例
Apr 17 Python
Python排序搜索基本算法之归并排序实例分析
Dec 08 Python
Python操作MySQL模拟银行转账
Mar 12 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
Python zip函数打包元素实例解析
Dec 11 Python
python日期与时间戳的各种转换示例
Feb 12 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
Elasticsearch 批量操作
Apr 19 Python
python缺失值的解决方法总结
Jun 09 #Python
Python提取PDF指定内容并生成新文件
Python激活Anaconda环境变量的详细步骤
Jun 08 #Python
Python序列化与反序列化相关知识总结
Jun 08 #Python
浅谈怎么给Python添加类型标注
Python如何导出导入所有依赖包详解
Jun 08 #Python
OpenCV-Python实现油画效果的实例
You might like
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
详解JavaScript函数绑定
2013/08/18 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
2019/02/15 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
手写Vue源码之数据劫持示例详解
2021/01/04 Vue.js
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
详解python字节码
2018/02/07 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
Php多进程实现代码
2018/05/07 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
规范化管理年活动总结
2014/08/29 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
python装饰器代码解析
2022/03/23 Python