如何使用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中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 Python
python使用urllib2实现发送带cookie的请求
Apr 28 Python
Python中Django发送带图片和附件的邮件
Mar 31 Python
python多进程控制学习小结
Oct 31 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
12个步骤教你理解Python装饰器
Jul 01 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
基于python实现复制文件并重命名
Sep 16 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 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
CI框架常用函数封装实例
2016/11/21 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
javascript之函数直接量(function(){})()
2007/06/29 Javascript
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
IE bug table元素的innerHTML
2010/01/11 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
一步步教你用Python实现2048小游戏
2017/01/19 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
利用python爬取软考试题之ip自动代理
2017/03/28 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
python中set()函数简介及实例解析
2018/01/09 Python
python实现简单加密解密机制
2019/03/19 Python
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
C++面试题:关于链表和指针
2013/06/05 面试题
拾金不昧的表扬信
2014/01/16 职场文书
先进个人获奖感言
2014/01/24 职场文书
介绍信范文大全
2015/05/07 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL