首页 > 编程语言 >python如何提取浏览器中保存的网站登录用户名密码

python如何提取浏览器中保存的网站登录用户名密码

时间:2023-08-26 17:44:37浏览次数:34  
标签:用户名 浏览器 python 密码 key password os

  python如何提取Chrome中的保存的网站登录用户名密码?

  很多浏览器都贴心地提供了保存用户密码功能,用户一旦开启,就不需要每次都输入用户名、密码,非常方便。作为python脚本,能否拿到用户提前保存在浏览器中的用户名密码,用以自动登录呢?必须有,小爬已经提前踩过很多坑,找到了可行的方案。

  以Chrome浏览器为例,浏览器中的用户数据(包含加密后的密码)都存在下图所示的位置中:

 

    文件的路径就像这样 C: => Users => <Your_Name> => AppData =>Local => Google => Chrome => User Data =>Local State

由于每台电脑的用户名是不确定的,因此小爬这里用python中的OS库来动态得到:

local_computer_directory_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local", "Google", "Chrome","User Data", "Local State")

  知道了具体位置后,我们需要先拿到加密后的密文,显然该密码肯定不是以明文的形式保存在文件中,否则安全无法保证。获取密文之前,还得先知道用于加密的密钥,这需要先安装pycryptodomex库,直接用pip来安装即可。一切就绪,现在编写一个获取密钥的python函数:

 1 import os,json,base64,sqlite3,win32crypt,shutil
 2 from Cryptodome.Cipher import AES
 3 #需要安装pip install pycryptodomex 库
 4 from datetime import  datetime, timedelta
 5 def fetching_encryption_key():
 6     '''动态获取保存用户数据的文件的路径,然后读出加密后的密文'''
 7     local_computer_directory_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local", "Google", "Chrome","User Data", "Local State")
 8     with open(local_computer_directory_path, "r", encoding="utf-8") as f:
 9         local_state_data = f.read()
10         local_state_data = json.loads(local_state_data)
11 
12     # decoding the encryption key using base64
13     encryption_key = base64.b64decode(
14     local_state_data["os_crypt"]["encrypted_key"])
15     
16     # remove Windows Data Protection API (DPAPI) str
17     encryption_key = encryption_key[5:]
18     # return decrypted key
19     return win32crypt.CryptUnprotectData(encryption_key, None, None, None, 0)[1]

  有了这个密钥,咱们还需要编写一个解密的方法将密码变成明文,考虑到Chrome浏览器的版本80之前和之后用了截然不同的加密手段,因此,对应的解密方法也不同,小爬将他们一并整合到解密的函数中:

def password_decryption(password, encryption_key):
    try:
        iv = password[3:15]
        password = password[15:]
        
        # generate cipher
        cipher = AES.new(encryption_key, AES.MODE_GCM, iv)
        
        # decrypt password
        return cipher.decrypt(password)[:-16].decode()
    except:
        
        try:
            return str(win32crypt.CryptUnprotectData(password, None, None, None, 0)[1])
        except:
            return "No Passwords"
  核心搞定之后,还涉及到一个知识点,用于某个网站登录的用户名 以及加密后的密文存储在哪里?别急,还是之前提到的Local State文件,其实它是一个本地sqlite3数据库文件,我们可以借助sqlite3库以及sql语法轻松获取。当然需要先知道目标网站的域名,比如小爬就想取本地chrome浏览器中我自己保存用于登录博客园网站(base_url="cnblogs.com")的用户名密码。另外需要注意的是,同一个网站,浏览器是支持同时保存几组用户名密码的。代码示例如下:
 1 def get_url_credential(base_url):
 2     '''如果chrome浏览器本地存储了OA密码,则返回用户和密码列表,否则返回False'''
 3     key = fetching_encryption_key()
 4     db_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local",
 5                         "Google", "Chrome", "User Data", "default", "Login Data")
 6     filename = "ChromePasswords.db"
 7     shutil.copyfile(db_path, filename) # 为了避免程序bug将原有的login Data 文件损坏,复制一份出来供程序用
 8     
 9     # connecting to the database
10     db = sqlite3.connect(filename)
11     cursor = db.cursor()
12     cursor.execute("select origin_url, action_url, username_value, password_value, date_created, date_last_used from logins order by date_last_used")
13     user_name,pass_word=None,None
14     userInfos=[] # 用于存放多组同一个网站的用户名 密码
15     for row in cursor.fetchall():
16         main_url = row[0]
17         if base_url in main_url:
18             user_name = row[2]
19             pass_word = password_decryption(row[3], key)
20             userInfos.append([user_name,pass_word])
21     cursor.close()
22     db.close()
23     try:
24         os.remove(filename)
25     except:
26         pass
27     return userInfos

  还在围观吗?动手能力强的已经跃跃欲试,把它用到真正的办公自动化场景中了。希望这些对现实业务的思考和代码实现,能对您的工作有所启发。不管咋说,活到老,学到老。拒绝躺平,一起卷起来!

快来关注本公众号 获取更多爬虫、数据分析的知识!

 

标签:用户名,浏览器,python,密码,key,password,os
From: https://www.cnblogs.com/new-june/p/17659190.html

相关文章

  • 用Python制作一个自动点击器,三种模块都可以
    顾名思义,Python中的自动点击器是一个简单的Python应用程序,可以按照用户的要求重复点击鼠标。不同的参数,如速度、频率和位置,可以根据用户的要求进行改变。Python有不同的模块可用于控制键盘、鼠标等设备。因此,我们可以使用这些模块在Python中轻松创建一个自动点击器。本教程将展......
  • 两种不同的方法来检查Python中的变量是否是字符串
    在Python中,每个变量都有一个数据类型。数据类型表示一个变量内部存储的是哪种数据。数据类型是编程语言最重要的特征,它区分了我们可以存储的不同类型的数据,如字符串、int和float。在处理许多编程问题时,可能会遇到这样的情况:我们需要找到某个变量的数据类型来对其执行一些任务。......
  • 用Python制作截图小工具
    Python编程语言允许我们执行各种任务,所有这些都是在简单模块和短小精悍的代码的帮助下完成的。在Python的帮助下进行屏幕截图就是这样一项任务。Python为我们提供了许多模块,使我们能够执行不同的任务。有多种方法可以使用Python及其库进行屏幕截图。用Pyautogui模块进行截图第......
  • Python中会被视为False的值有以下几种
    Python中会被视为False的值有以下几种:布尔值:False数值:0或0.0字符串:空字符串,如’'或""容器:空的容器,如[],(),{},set()None:None其他的值都会被视为True。您可以用bool()函数来测试一个值是否为True或False。例如:bool(0)#Falsebool(1)#Truebool('')#Falsebool('Hello'......
  • Python中如何判断列表是否为空
    Python中如何判断列表是否为空介绍列表是Python中最常用的数据结构之一,可以存储多个元素,比如数字,字符串,对象等列表的使用场景很多,比如排序,查找,统计,过滤等在使用列表的过程中,有时候需要判断列表是否为空,也就是列表中是否有元素在Python中,有两种常用的方法来判断列表是否为空,......
  • 如何使用MicroPython将Raspberry Pi Pico W与伺服电机连接?
    PicoW是一款经济实惠且紧凑的微控制器板,基于RP2040芯片,非常适合嵌入式系统和物联网项目。MicroPython是Python的轻量级实现,为微控制器编程提供了用户友好的环境。通过遵循概述的步骤,读者将学习如何将伺服电机连接到PicoW、编写MicroPython代码来控制其运动,并获得将精确......
  • Python中小括号( )、中括号[ ]和大括号{}分别代表什么?
     Python中,小括号 () 代表元组数据类型,中括号 [] 代表列表数据类型,大括号 {} 代表字典数据类型。 元组是一种不可变序列,创建方法很简单,大多时候都是用小括号括起来的。例如:tup=(1,2,3)列表是一种可变序列,其创建方法即简单又特别。例如:list=['a','b',......
  • 自动启动浏览器联网
    1,安装相应的python库2,下载edge浏览器驱动weddriver python文件转成exe文件Python生成exe程序_python生成exe_minky糕的博客-CSDN博客  参考链接编写python代码实现打开并登录网页、对网页进行点击、输入信息等操作_python操作网页_shiaohan的博客-CSDN博客 pyth......
  • centos7.6 anaconda安装python
    在CentOS7.6上安装Anaconda并配置Python3.8.17环境可以按照以下步骤进行操作:下载Anaconda:首先,前往Anaconda官网下载适用于Linux的Anaconda安装包。选择适合你操作系统位数的版本(通常是64位)。下载链接:https://www.anaconda.com/products/distribution安装......
  • js 下载流调用浏览器预览 的方法
    //文件预览js下载流调用浏览器预览的方法var$viewblob=function(url,data){constconfig={responseType:'blob',timeout:9999999};$http(url,data,config).then(res=>{constfileRes=res;lettype={type:'application/octet-stream......