如何使用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中join和split用法实例
Apr 14 Python
python简单判断序列是否为空的方法
Jun 30 Python
Python爬虫实例爬取网站搞笑段子
Nov 08 Python
Python使用遗传算法解决最大流问题
Jan 29 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
Django中的用户身份验证示例详解
Aug 07 Python
jupyter notebook 参数传递给shell命令行实例
Apr 10 Python
Python 字典中的所有方法及用法
Jun 10 Python
Python面向对象之成员相关知识总结
Jun 24 Python
深入浅析Django MTV模式
Sep 04 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
php中adodbzip类实例
2014/12/08 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
简单的js分页脚本
2009/05/21 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
vue开发移动端底部导航条功能
2020/04/08 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
Python实现全角半角字符互转的方法
2016/11/28 Python
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
英语专业学生个人求职信范文
2014/01/06 职场文书
父亲节活动策划方案
2014/08/24 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
党小组推荐意见
2015/06/02 职场文书
2016教师节问候语
2015/11/10 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python