最近python脚本cookie解密出现问题,报错
pywintypes.error: (87, 'CryptProtectData', '参数错误。')
也有13 也有87
最近一直很忙,没有时间查找原因,从字节码上可以看到能够正常解密的cookie是没有v10前缀的,查找cookie加解密方式,发现在chrome 80+版本以后对 cookie加密方式进行了调整,网上的所有cookie加解密的方法目前都失效,还好目前已经有很多人提供了最新的解密方法,
如果对原理等有兴趣的话,可以参考
这里进行简单的调整,方便新老cookie的加解密,简单增加一下v10的判断。
import os
import json
import base64
import sqlite3
from win32crypt import CryptUnprotectData
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
def get_string(local_state):
with open(local_state, 'r', encoding='utf-8') as f:
s = json.load(f)['os_crypt']['encrypted_key']
return s
def pull_the_key(base64_encrypted_key):
encrypted_key_with_header = base64.b64decode(base64_encrypted_key)
encrypted_key = encrypted_key_with_header[5:]
key = CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
return key
def decrypt_string(key, data):
nonce, cipherbytes = data[3:15], data[15:]
aesgcm = AESGCM(key)
plainbytes = aesgcm.decrypt(nonce, cipherbytes, None)
plaintext = plainbytes.decode('utf-8')
return plaintext
def get_cookie_from_chrome(host: '.oschina.net'):
local_state = os.environ['LOCALAPPDATA'] + r'\Google\Chrome\User Data\Local State'
cookie_path = os.environ['LOCALAPPDATA'] + r"\Google\Chrome\User Data\Default\Cookies"
sql = "select host_key,name,encrypted_value from cookies where host_key='%s'" % host
with sqlite3.connect(cookie_path) as conn:
cu = conn.cursor()
res = cu.execute(sql).fetchall()
cu.close()
cookies = {}
key = pull_the_key(get_string(local_state))
for host_key, name, encrypted_value in res:
if encrypted_value[0:3] == b'v10':
cookies[name] = decrypt_string(key, encrypted_value)
else:
cookies[name] = CryptUnprotectData(encrypted_value)[1].decode()
# print(cookies)
return cookies