在Windows系统上解密Chrome的cookies

4
我写了一个程序使用Chrome的登录cookie自动执行某些操作,但自从Chrome在1月份加密所有cookie以来,我的程序就无法工作了。
我正在尝试解密cookie,并成功地在mac os上使用Java通过该主题进行解密,但我通常运行的环境是Win7操作系统,所以我必须在Windows上进行解密。
我在Chromium的源代码中找到了os_crypt_win.cc,其中包含一个加密部分:
bool OSCrypt::EncryptString(const std::string& plaintext, std::string* ciphertext) {
  DATA_BLOB input;
  input.pbData = const_cast<BYTE*>(reinterpret_cast<const BYTE*>(plaintext.data()));
  input.cbData = static_cast<DWORD>(plaintext.length());

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

  // this does a copy
  ciphertext->assign(reinterpret_cast<std::string::value_type*>(output.pbData), output.cbData);

  LocalFree(output.pbData);
  return true;
}

我使用JNA在Java中模仿了这个部分:

String encrypted = bytesToHex(Crypt32Util.cryptProtectData(Native.toByteArray(plaintext), 0));

或者

String encrypted = bytesToHex(Crypt32Util.cryptProtectData(plaintext.getBytes());

或者

String encrypted = bytesToHex(Crypt32Util.cryptProtectData(plaintext.getBytes("UTF-8"));

或者

String encrypted = bytesToHex(Crypt32Util.cryptProtectData(plaintext.getBytes("UTF-16"));

但是我得到的加密值与Chrome中存储的值不同。

我使用了错误的加密方法,还是我错过了重要的东西?

你能帮我解决这个问题吗?

1个回答

1
您使用了正确的方法来加密这些值。 如果这些值只是与存储在 Chrome 中的值不同,那就不是问题。 原因很简单:
来自 msdn:
“该函数创建一个会话密钥来执行加密。当要解密数据时,会再次派生会话密钥。”
来自 msdn blog:
“每次调用 CryptProtectData 都会创建一个随机的会话密钥。 此密钥从主密钥、一些随机数据和用户传递的一些可选熵中派生而来。然后使用会话密钥来进行实际加密。”
您应该检查的重要事项是是否能够使用 DecryptUnprotectData 解密这些值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接