gpt4 book ai didi

c# - 尝试解密 Chrome cookie 时,DPAPI 失败并出现 CryptographicException

转载 作者:行者123 更新时间:2023-12-01 17:42:41 25 4
gpt4 key购买 nike

我正在尝试从 Chrome 浏览器获取 session 。我可以在开发者工具中看到 2 个 cookie 文件。但这对于用户从浏览器获取cookie值来说很不方便,我想用代码来完成。所以我使用此代码来获取 Chrome 默认配置文件 cookie sqlite DB:

string local = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string path = @"Google\Chrome\User Data\Default\Cookies";

path = Path.Combine(local, path);

接下来我创建 SQLite 连接和请求

var cmd = new SQLiteCommand("SELECT encrypted_value, name FROM cookies WHERE host_key = 'my_host_ip'", con);

然后我读了结果

byte[] encryptedCookie = (byte[])r.GetValue(r.GetOrdinal("encrypted_value"));

并尝试解密它:

var decodedData = ProtectedData.Unprotect(encryptedCookie, null, DataProtectionScope.CurrentUser);
var plainText = Encoding.ASCII.GetString(decodedData);

这里我遇到了异常

System.Security.Cryptography.CryptographyException

我知道我必须在启动浏览器的同一用户帐户下(在同一台计算机上)解密 cookie 内容,并且参数 DataProtectionScope.CurrentUser 用于此目的

我在调试器中看到了 63 个字节(在 encryptedCookie 数组中),我还在 SQLite DB BLOB 字段中看到了这个字节。但 Unprotect 方法会抛出 System.Security.Cryptography.CryptographicException: Invalid data 错误。

我的代码在我办公室的 5 台不同电脑(win10、win7)上运行良好,但在我的开发人员电脑(win10、vs2019)上无法运行。

我认为问题出在我的 Windows 设置或其他地方,而不是我的代码中。那么我做错了什么?

有趣的说明 - 我发现 PowerShell 脚本可以做同样的事情(通过 Add-Type -AssemblyName System.Security) - 获取 cookie 并解密它。该脚本在 5 台办公室 PC 上也可以正常工作,但在我的 PC 上却不起作用。

我的 Windows 安装是新的,我没有 AV 软件。我们连接到同一个公司域,并且具有相同的安全设置。

UPD 1一点实验:

  1. 从 Chrome 浏览器获取 Cookie 值(32 个字符,JSESSIONID)
  2. 创建一个简单的应用,通过 CurrentUser 保护范围来保护该值。现在我有一个 178 字节的数组(结果#1)
  3. 使用 a) https://sqliteonline.com/ 查看 Chrome 的 cookie 数据库b) DataBase.Net 桌面应用程序。这两种方法给出了相同的结果:只有 63 字节的加密 cookie 数据(结果#2)。我也可以使用 System.Data.SQLite
  4. 在我的 C# 应用程序中获得相同的结果

所以,结果的长度或内容不相等结果 #1 != 结果 #2

看起来 Chrome 的 cookie 值受到不同范围的保护(可能是管理员帐户?),但我在 Chrome 进程的任务管理器中看到了我的用户帐户名称

附注我使用.net 4.7.2

UPD 2我在 Chromium 源中找到了这个方法

bool OSCrypt::DecryptString(const std::string& ciphertext,
std::string* plaintext) {
if (!base::StartsWith(ciphertext, kEncryptionVersionPrefix,
base::CompareCase::SENSITIVE))
return DecryptStringWithDPAPI(ciphertext, plaintext);

crypto::Aead aead(crypto::Aead::AES_256_GCM);

auto key = GetEncryptionKeyInternal();
aead.Init(&key);

// Obtain the nonce.
std::string nonce =
ciphertext.substr(sizeof(kEncryptionVersionPrefix) - 1, kNonceLength);
// Strip off the versioning prefix before decrypting.
std::string raw_ciphertext =
ciphertext.substr(kNonceLength + (sizeof(kEncryptionVersionPrefix) - 1));

return aead.Open(raw_ciphertext, nonce, std::string(), plaintext);
}

因此 DPAPI 仅在 BLOB 不以 v10 字符开头时使用。但我的 cookie BLOB 以 v10 字符开头,并且根据代码,使用了另一种加密算法,但我不明白为什么。

最佳答案

我终于明白了。根据 Chromium 消息来源,有两种方法用于解密 cookie 值。

  1. 如果 Cookie 值以 v10 字符开头,我们使用 AES_256_GCM
  2. 否则,将使用DPAPI

对于第一种方法,我们需要 key 和随机数。 key 位于 Google Chrome 文件中,nonce 位于加密的 cookie 值中。

我仍然不清楚 - 是什么决定了使用哪种方法

关于c# - 尝试解密 Chrome cookie 时,DPAPI 失败并出现 CryptographicException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60230456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com