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和bash统计CPU利用率的方法
Jul 10 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
django项目搭建与Session使用详解
Oct 10 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
python实现可变变量名方法详解
Jul 01 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
Python函数中apply、map、applymap的区别
Nov 27 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的call_user_func传reference引发的思考
2010/07/23 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
jquery UI 1.72 之datepicker
2009/12/29 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
利用Python演示数型数据结构的教程
2015/04/03 Python
介绍Python中的__future__模块
2015/04/27 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
聊聊Python中的pypy
2018/01/12 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
python3访问字典里的值实例方法
2020/11/18 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
台湾生鲜宅配:大口市集
2017/10/14 全球购物
高中生学习总结的自我评价范文
2013/10/13 职场文书
党员年度个人总结
2015/02/14 职场文书
工作试用期自我评价
2015/03/10 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
Django中celery的使用项目实例
2022/07/07 Python