从Chrome 80及更高版本开始,在GCM模式下使用AES-256对cookie进行加密。应用的密钥使用DPAPI加密。细节描述在这里,部分
铬v80.0或更高 。
加密密钥以ASCII编码
DPAPI(即
0x4450415049)开头,并且是base64编码的,即密钥必须首先经过base64解码,并且必须删除前5个字节。之后,可以解密
win32crypt.CryptUnprotectData。解密返回一个元组,其第二个值包含解密的密钥:
import osimport jsonimport base64 import win32cryptfrom Crypto.Cipher import AESpath = r'%LocalAppData%GoogleChromeUser DataLocal State'path = os.path.expandvars(path)with open(path, 'r') as file: encrypted_key = json.loads(file.read())['os_crypt']['encrypted_key']encrypted_key = base64.b64depre(encrypted_key) # base64 decodingencrypted_key = encrypted_key[5:] # Remove DPAPIdecrypted_key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1] # Decrypt key
cookies的加密在GCM模式下使用AES-256执行。这是经过身份验证的加密,可确保机密性和真实性/完整性。在加密期间,将生成一个身份验证标签,该身份验证标签用于解密期间的完整性验证。GCM模式基于CTR模式,并使用IV(即席)。除32个字节的密钥外,解密还需要现时和身份验证标签。
加密数据以ASCII编码
v10(即
0x763130)开头,后跟12个字节的随机数,实际密文,最后是16个字节的身份验证标签。各个组件可以按以下方式分开:
data = bytes.fromhex('763130...') # the encrypted cookienonce = data[3:3+12]ciphertext = data[3+12:-16]tag = data[-16:]从而
data包含加密的数据。解密本身是使用PyCryptodome完成的:
cipher = AES.new(decrypted_key, AES.MODE_GCM, nonce=nonce)plaintext = cipher.decrypt_and_verify(ciphertext, tag) # the decrypted cookie
注意:通常,还会存储已使用v80以下的Chrome版本保存的cookie,因此已对DPAPI进行了加密。可以通过以下事实来识别DPAPI加密的cookie:它们以序列开头
0x01000000D08C9DDF0115D1118C7A00C04FC297EB(此处和此处
关于DPAPI的
部分)开头。这些cookie当然不能如上所述进行解密,但是可以使用DPAPI加密cookie的前一过程进行解密。用于查看未加密或已加密形式的cookie的工具分别是
ChromecookiesView
或 SQLite的数据库浏览器 。



