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实现dict版图遍历示例
Feb 19 Python
用Python实现QQ游戏大家来找茬辅助工具
Sep 14 Python
Python转换HTML到Text纯文本的方法
Jan 15 Python
理解python正则表达式
Jan 15 Python
Linux CentOS7下安装python3 的方法
Jan 21 Python
python距离测量的方法
Mar 06 Python
Python中Unittest框架的具体使用
Aug 27 Python
基于python修改srt字幕的时间轴
Feb 03 Python
python IDLE添加行号显示教程
Apr 25 Python
Django admin组件的使用
Oct 24 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
教你用Python matplotlib库制作简单的动画
Jun 11 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&java(三)
2006/10/09 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
php链式操作的实现方式分析
2019/08/12 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
jquery 选项卡效果 新手代码
2011/07/08 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
简单介绍Python中的struct模块
2015/04/28 Python
python变量不能以数字打头详解
2016/07/06 Python
Python3爬虫全国地址信息
2019/01/05 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
2014年医院后勤工作总结
2014/12/06 职场文书
大四学生个人总结
2015/02/15 职场文书
会计工作检讨书
2015/02/19 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
SQL SERVER存储过程用法详解
2022/02/24 SQL Server