Chrome 80如何解码Cookie [英] Chrome 80 how to decode cookies

查看:579
本文介绍了Chrome 80如何解码Cookie的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用于打开和解密Google Chrome cookie的有效脚本,

I had a working script for opening and decrypting Google Chrome cookies which looked like:

decrypted = win32crypt.CryptUnprotectData(enctypted_cookie_value, None, None, None, 0)

似乎在更新80之后,它不再有效解决方案。

It seems that after update 80 it is no longer a valid solution.

根据此博客文章 https://blog.nirsoft.net/2020/02/19/tools-update-new-encryption-chrome-chromium-version-80/ 似乎我需要从本地状态文件中的cryptost_key上对CryptUnprotectData进行加密,而不是使用解密后的密钥以某种方式解密cookie。

According to this blog post https://blog.nirsoft.net/2020/02/19/tools-update-new-encryption-chrome-chromium-version-80/ it seems that i need to CryptUnprotectData on encrypted_key from Local State file, than somehow decrypt cookie, using decrypted key.

对于第一部分,我得到了crypto_key

For the first part i got my encrypted_key

path = r'%LocalAppData%\Google\Chrome\User Data\Local State'
path = os.path.expandvars(path)
with open(path, 'r') as file:
    encrypted_key = json.loads(file.read())['os_crypt']['encrypted_key']
encrypted_key = bytearray(encrypted_key, 'utf-8')

然后我尝试对其进行解密

Then i tried to decrypt it

decrypted_key = win32crypt.CryptUnprotectData(encrypted_key,None,None,None,0)

decrypted_key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)

并得到了例外:

pywintypes.error: (13, 'CryptProtectData', 'The data is invalid.')

我不知道如何解决

同样对于加密的第二部分,似乎我应该使用pycryptodome,如下所示:

Also for the second part of encryption, it seems that i should use pycryptodome, something like this snippet:

cipher = AES.new(encrypted_key, AES.MODE_GCM, nonce=nonce)
plaintext = cipher.decrypt(data)

但是我不知道应该从哪里获得现时价值

But i can't figure out where i should get nonce value

有人可以解释一下,如何正确地解密Chrome cookie吗?

Can someone explain, how to do Chrome cookies decrypting correctly?

推荐答案

自Chrome 80或更高版本开始,Cookie在GCM模式下使用AES-256进行加密。应用的密钥使用DPAPI加密。详细信息在此处的 Chrome v80.0及更高版本中进行了描述

Since Chrome version 80 and higher, cookies are encrypted using AES-256 in GCM mode. The applied key is encrypted using DPAPI. The details are described here, section Chrome v80.0 and higher.

加密密钥以 DPAPI 的ASCII编码开头(即 0x4450415049 ),并且是Base64编码的,即密钥必须先经过Base64解码,并且前5个字节必须删除。之后,可以使用 win32crypt.CryptUnprotectData 进行解密。解密返回一个元组,其第二个值包含解密的密钥:

The encrypted key starts with the ASCII encoding of DPAPI (i.e. 0x4450415049) and is Base64 encoded, i.e. the key must first be Base64 decoded and the first 5 bytes must be removed. Afterwards a decryption with win32crypt.CryptUnprotectData is possible. The decryption returns a tuple whose second value contains the decrypted key:

import os
import json
import base64 
import win32crypt
from Crypto.Cipher import AES

path = r'%LocalAppData%\Google\Chrome\User Data\Local 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.b64decode(encrypted_key)                                       # Base64 decoding
encrypted_key = encrypted_key[5:]                                                     # Remove DPAPI
decrypted_key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]  # Decrypt key

Cookie的加密使用 AES-256 el = noreferrer> GCM模式。这是经过身份验证的加密,可确保机密性和真实性/完整性。在加密期间,会生成一个身份验证标签,该身份验证标签用于解密期间的完整性验证。 GCM模式基于CTR模式并使用IV(即席)。除了32个字节的密钥外,解密还需要现时和身份验证标签。

The encryption of the cookies is performed with AES-256 in GCM mode. This is authenticated encryption, which guarantees confidentiality and authenticity/integrity. During encryption an authentication tag is generated, which is used for integrity verification during decryption. The GCM mode is based on the CTR mode and uses an IV (nonce). In addition to the 32 bytes key, the nonce and the authentication tag are required for decryption.

加密数据以 v10 (即 0x763130 ),然后是12个字节的随机数,实际密文,最后是16个字节的身份验证标签。各个组件可以按如下所示进行分隔:

The encrypted data start with the ASCII encoding of v10 (i.e. 0x763130), followed by the 12 bytes nonce, the actual ciphertext and finally the 16 bytes authentication tag. The individual components can be separated as follows:

data = bytes.fromhex('763130...') # the encrypted cookie
nonce = data[3:3+12]
ciphertext = data[3+12:-16]
tag = data[-16:]

其中, data 包含加密的数据。解密本身是通过 PyCryptodome 完成的:

whereby data contains the encrypted data. The decryption itself is done using PyCryptodome with:

cipher = AES.new(decrypted_key, AES.MODE_GCM, nonce=nonce)
plaintext = cipher.decrypt_and_verify(ciphertext, tag) # the decrypted cookie

注意:通常,还存储了一些cookie低于v80的Chrome版本,因此已被DPAPI加密。可以通过以下事实来识别DPAPI加密的cookie:它们以序列 0x01000000D08C9DDF0115D1118C7A00C04FC297EB 此处此处,关于DPAPI 部分。当然,不能如上所述对这些cookie进行解密,而是使用DPAPI加密cookie的前一过程进行解密。查看未加密或已加密形式的Cookie的工具是 ChromeCookiesView 或分别 SQLite数据库浏览器

Note: Generally, there are also cookies stored that have been saved with Chrome versions below v80 and are therefore DPAPI encrypted. DPAPI encrypted cookies can be recognized by the fact that they start with the sequence 0x01000000D08C9DDF0115D1118C7A00C04FC297EB, here and here, section About DPAPI. These cookies can of course not be decrypted as described above, but with the former procedure for DPAPI encrypted cookies. Tools to view cookies in unencrypted or encrypted form are ChromeCookiesView or DB Browser for SQLite, respectively.

这篇关于Chrome 80如何解码Cookie的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆