最近遇到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'])
密碼獲取
開啟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]}')
密碼解密
因為得到的密碼是密文,因此需要解密後才能得到正確的密碼
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]))
完整程式碼
解密後並儲存為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)