由于谷歌浏览器80以后版本采用了新的加密方式,所以记录在这里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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 获取浏览器密码的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/lyalong/tag/python/default.html?page=2