当前位置: 首页 > 面试题库 >

Chrome 80如何解码Cookie

樊桐
2023-03-14
问题内容

我有一个用于打开和解密Google Chrome Cookie的工作脚本,如下所示:

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

在第一部分中,我得到了我的加密密钥

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')

然后我试图解密

unlocked_key = win32crypt.CryptUnprotectData(encrypted_key,无,无,无,0)

并得到例外:

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

我不知道如何解决它

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

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

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

有人可以解释如何正确执行Chrome cookie的解密吗?


问题答案:

从Chrome 80及更高版本开始,在GCM模式下使用AES-256对cookie进行加密。应用的密钥使用DPAPI加密。细节描述在这里,部分
铬v80.0或更高

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

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

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

加密数据以ASCII编码v10(即0x763130)开头,后跟12个字节的随机数,实际密文,最后是16个字节的身份验证标签。各个组件可以按以下方式分开:

data = bytes.fromhex('763130...') # the encrypted cookie
nonce = 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的数据库浏览器



 类似资料:
  • 问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码:

  • 问题内容: 创建公司使用的平台的开发人员不再为我们工作,而且我不知道如何从自定义PHP应用程序中检索密码。 当我查看PHPmyAdmin时,密码已加密(例如* 2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19) 如何更改或检索这些? 问题答案: 如果使用正确的加密方法,将无法轻松检索它们。 只需使用新密码重置即可。 编辑: 字符串看起来像它正在使用:

  • 由于Groovy擅长解析几乎任何东西,因此搜索如何解析Groovy代码不会显示任何好的结果-所以我希望SO社区能够提供帮助:-) 我想为grails领域类编写某种(图形化)编辑器,但不想重新发明轮子。 通过反射检查域类很容易,但是我想更进一步——我想修改代码并将其作为域类文件写回来。 一个问题是反射(以及afaik AST)会丢弃所有注释和格式(格式不是大问题,我可以打印文件)… 我可以在哪里找到

  • 我不明白这个图书馆是如何工作的。你能帮帮我吗? 以下是我的简单代码: 这是错误: 字符串需要采用紧凑的JSON格式,格式为:Base64UrlEncodedHeader。Base64UrlEndcodedPayload。可选,Base64UrlEncodedSignature'。 如果你复制流在jwt.io网站,它的作品罚款:)

  • new String(..)转字符串的时候是怎么知道 -28, -72, -83 为一组的呢? 是字符编码有什么规则吗?( 0x**---- ,(byte) ** 是负数的就是3个字节一组这样?)

  • 问题内容: 我用python脚本下载了一个网页。在大多数情况下,这可以正常工作。 但是,这个有一个响应标头:GZIP编码,当我尝试打印此网页的源代码时,它的腻子中包含所有符号。 如何将其解码为普通文本? 问题答案: 我使用zlib从Web解压缩压缩的内容。