python 获取谷歌浏览器保存的密码


Posted in Python onJanuary 06, 2021

由于谷歌浏览器80以后版本采用了新的加密方式,所以记录在这里

# -*- coding:utf-8 -*-
import os
import json
import base64
import sqlite3
from win32crypt import CryptUnprotectData
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

#  pip install pywin32
#  pip install cryptography
#  文档:https://source.chromium.org/chromium/chromium/src/+/master:components/os_crypt/os_crypt_win.cc?q=OSCrypt&ss=chromium

class Chrome:
  def __init__(self):
    self.local_state = os.environ['LOCALAPPDATA'] + r'\Google\Chrome\User Data\Local State'
    self.cookie_path = os.environ['LOCALAPPDATA'] + r"\Google\Chrome\User Data\Default\Login Data"

  def get_key(self):
    with open(self.local_state, 'r', encoding='utf-8') as f:
      base64_encrypted_key = json.load(f)['os_crypt']['encrypted_key']
    encrypted_key_with_header = base64.b64decode(base64_encrypted_key)
    # 去掉开头的DPAPI
    encrypted_key = encrypted_key_with_header[5:]
    key_ = CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
    return key_

  @staticmethod
  def decrypt_string(key, secret, salt=None):
    """
    解密
    """
    # 去掉'v10'
    nonce, cipher_bytes = secret[3:15], secret[15:]
    aes_gcm = AESGCM(key)
    return aes_gcm.decrypt(nonce, cipher_bytes, salt).decode('utf-8')

  @staticmethod
  def encrypt_string(key, data, salt=None):
    """
    加密
    """
    aes_gcm = AESGCM(key)
    prefix = "v10".encode("utf-8")
    # 随机生成12位字符串,拼接"v10" 共15位
    nonce = os.urandom(12)
    cipher_bytes = data.encode("utf-8")
    return prefix + nonce + aes_gcm.encrypt(nonce, cipher_bytes, salt)

  def get_password(self, host):
    sql = f"select username_value,password_value from logins where signon_realm ='{host}';"
    with sqlite3.connect(self.cookie_path) as conn:
      cu = conn.cursor()
      res = cu.execute(sql).fetchall()
      cu.close()
      result = []
      key = self.get_key()

      for name, encrypted_value in res:

        if encrypted_value[0:3] == b'v10' or encrypted_value[0:3] == b'v11':
          password = self.decrypt_string(key, encrypted_value)
        else:
          password = CryptUnprotectData(encrypted_value)[1].decode()
        result.append({'user_name': name, 'password': password})
      return result

  def set_password(self, host, username, password):
    key = self.get_key()
    encrypt_secret = self.encrypt_string(key, password)
    sq = f"""update logins set password_value=x'{encrypt_secret.hex()}' where signon_realm ='{host}' and username_value='{username}';"""
    with sqlite3.connect(self.cookie_path) as conn:
      cu = conn.cursor()
      cu.execute(sq)
      conn.commit()


if __name__ == '__main__':
  a = Chrome()
  aa = a.get_password("https://baidu.com")
  print(aa)

以上就是python 获取谷歌浏览器保存的密码的详细内容,更多关于python 获取浏览器密码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python自动连接ssh的方法
Mar 07 Python
在Python的web框架中中编写日志列表的教程
Apr 30 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
python交互式图形编程实例(二)
Nov 17 Python
5分钟 Pipenv 上手指南
Dec 20 Python
Python3 log10()函数简单用法
Feb 19 Python
手把手教你pycharm专业版安装破解教程(linux版)
Sep 26 Python
django中瀑布流写法实例代码
Oct 14 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
Dec 23 Python
python中np是做什么的
Jul 21 Python
python判断元素是否存在的实例方法
Sep 24 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 Python
python实现PolynomialFeatures多项式的方法
Jan 06 #Python
pytorch中index_select()的用法详解
Jan 06 #Python
Python之京东商品秒杀的实现示例
Jan 06 #Python
Python实现小黑屋游戏的完整实例
Jan 06 #Python
Jupyter Notebook 安装配置与使用详解
Jan 06 #Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 #Python
python requests库的使用
Jan 06 #Python
You might like
用PHP实现验证码功能
2006/10/09 PHP
PHP编码规范-php coding standard
2007/03/16 PHP
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
php函数与传递参数实例分析
2014/11/15 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
PHP中串行化用法示例
2016/11/16 PHP
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
详解python中asyncio模块
2018/03/03 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
django rest framework 自定义返回方式
2020/07/12 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
如何通过python检查文件是否被占用
2020/12/18 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
python爬取youtube视频的示例代码
2021/03/03 Python
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
教学评估实施方案
2014/03/16 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
关于爱国的标语
2014/06/24 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
初中英语教学反思范文
2016/02/15 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
python关于集合的知识案例详解
2021/05/30 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android