瀏覽器儲存密碼獲取與解密

wstong發表於2024-12-02

最近遇到edge開啟就崩潰的問題,想換成chrome,但是edge裡面的書籤和密碼還未匯出,再查詢後得出以下辦法。

檔案位置

金鑰位置

C:\Users\使用者名稱\AppData\Local\Microsoft\Edge\User Data\Local State

加密的密碼位置

C:\Users\使用者名稱\AppData\Local\Microsoft\Edge\User Data\Default\Login Data

書籤位置

C:\Users\使用者名稱\AppData\Local\Microsoft\Edge\User Data\Default\Bookmarks

cookies位置

C:\Users\使用者名稱\AppData\Local\Microsoft\Edge\User Data\Default\Network\Cookies

history位置

C:\Users\使用者名稱\AppData\Local\Microsoft\Edge\User Data\Default\History

獲取金鑰

開啟Local State檔案並獲取金鑰,該檔案是一個json檔案

import json
with open('Local State', 'r', encoding='utf-8') as f:
    localState = json.loads(f.read())
print(localState['os_crypt']['encrypted_key'])

image

密碼獲取

開啟Login Data檔案並獲取加密的密碼,該檔案是一個sqlite資料庫

import sqlite3
conn = sqlite3.connect('Login Data')
cur = conn.cursor()
cur.execute("select origin_url, username_value, password_value from logins")
res = cur.fetchall()
for i in range(len(res)):
    print(f'Url: {res[i][0]}')
    print(f'Username: {res[i][1]}')
    print(f'Cipher Text: {res[i][2]}')

image

密碼解密

因為得到的密碼是密文,因此需要解密後才能得到正確的密碼

import base64
from Crypto.Cipher import AES
from win32crypt import CryptUnprotectData

secretKey = base64.b64decode(localState['os_crypt']['encrypted_key'])
secretKey = secretKey[5:]
secretKey = CryptUnprotectData(secretKey, None, None, None, 0)[1]

def decrypt(cipherText):
    initialisationVector = cipherText[3:15]  # 從密文中提取初始化向量
    encryptedPassword = cipherText[15:-16]  # 從密文中提取加密密碼
    cipher = AES.new(secretKey, AES.MODE_GCM, initialisationVector)  # 構造AES演算法解密密碼
    decryptedPass = cipher.decrypt(encryptedPassword)
    decryptedPass = decryptedPass.decode()
    return decryptedPass

print(decrypt(res[38][2]))

image

完整程式碼

解密後並儲存為xlsx檔案,使用前需要先將Local State和Local Data檔案複製到指令碼目錄

import json, sqlite3, base64, pandas as pd
from Crypto.Cipher import AES
from win32crypt import CryptUnprotectData

with open('Local State', 'r', encoding='utf-8') as f:
    localState = json.loads(f.read())
secretKey = base64.b64decode(localState['os_crypt']['encrypted_key'])
secretKey = secretKey[5:]
secretKey = CryptUnprotectData(secretKey, None, None, None, 0)[1]

def decrypt(cipherText):
    initialisationVector = cipherText[3:15]  # 從密文中提取初始化向量
    encryptedPassword = cipherText[15:-16]  # 從密文中提取加密密碼
    cipher = AES.new(secretKey, AES.MODE_GCM, initialisationVector)  # 構造AES演算法解密密碼
    decryptedPass = cipher.decrypt(encryptedPassword)
    decryptedPass = decryptedPass.decode()
    return decryptedPass

conn = sqlite3.connect('Login Data')
cur = conn.cursor()
cur.execute("select origin_url, username_value, password_value from logins")
res = cur.fetchall()
data = { 'url': [], 'username': [], 'password': []}
for i in range(len(res)):
    data['url'].append(res[i][0])
    data['username'].append(res[i][1])
    data['password'].append(decrypt(res[i][2]))
data = pd.DataFrame(data)
data.to_excel('LoginData.xlsx', index=None)

相關文章