用Python解密Chrome Linux BLOB加密的cookies

12 投票
3 回答
16116 浏览
提问于 2025-04-18 02:05

我在Ubuntu上使用Chrome 33以上版本,发现这些cookie是以一种叫BLOB的结构加密存储的:

CREATE TABLE cookies (creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY,host_key TEXT NOT NULL,name TEXT NOT NULL,value TEXT NOT NULL,path TEXT NOT NULL,expires_utc INTEGER NOT NULL,secure INTEGER NOT NULL,httponly INTEGER NOT NULL,last_access_utc INTEGER NOT NULL, has_expires INTEGER NOT NULL DEFAULT 1, persistent INTEGER NOT NULL DEFAULT 1,priority INTEGER NOT NULL DEFAULT 1,encrypted_value BLOB DEFAULT '');

我想写一个Python脚本来解密这些cookie。我看到有一个关于Chrome 33 Beta的cookie问题,但它依赖于CryptUnprotectData,这是一个Windows的API。

首先,我想知道这些cookie是怎么加密的。我读过3DES和AES,但找不到可靠的来源来获取这些信息。

如果我能找到如何进行加密和解密的信息,我会写代码来完成这些操作。

谢谢

3 个回答

2

评论有点让人困惑,所以我来澄清一下。这段话是关于Chromium源代码中的os_crypt_win.cc文件的。简单来说,它就是把一个字符串放进一个叫做“blob”的东西里,然后运行一个叫做CryptUnprotectData()的函数。

bool OSCrypt::DecryptString(const std::string& ciphertext,
                            std::string* plaintext) {
  DATA_BLOB input;
  input.pbData = const_cast<BYTE*>(
      reinterpret_cast<const BYTE*>(ciphertext.data()));
  input.cbData = static_cast<DWORD>(ciphertext.length());

  DATA_BLOB output;
  BOOL result = CryptUnprotectData(&input, NULL, NULL, NULL, NULL,
                                   0, &output);
  if (!result)
    return false;

  plaintext->assign(reinterpret_cast<char*>(output.pbData), output.cbData);
  LocalFree(output.pbData);
  return true;
}
6

我也在研究这个问题。到目前为止,我发现Chrome浏览器(在Windows系统上)使用了一个叫做CryptProtectData的功能来加密它的cookie值。这个功能也是用来加密保存在登录数据文件中的密码的。CryptProtectData会利用当前登录Windows用户的账户信息和密码来加密数据。要解密这些数据,我们需要用同一个登录用户的CryptUnProtectData功能。

这里有一段代码可以用来解密登录数据:https://gist.github.com/jordan-wright/5770442

至于Linux系统,我在这里读到的信息是:http://www.linkedin.com/groups/Google-Chrome-encrypt-Stored-Cookies-36874.S.5826955428000456708

在其他系统上,它似乎是用“saltysalt”这个盐值和“peanuts”这个密码来混淆密码。

7

我在这里发布了一个示例的Python脚本,可以用来解码在OSX或Linux系统中加密的cookies

撰写回答