C#解密Chrome v20 Cookie遇阻:应用绑定密钥解密失败
问题重现
尝试在C#中解密Chrome v20版本Cookie,参考Python实现解密应用绑定密钥时,执行以下代码报错:
var appBoundEncKeyB64 = JObject.Parse(localState)["os_crypt"]["app_bound_encrypted_key"].ToString(); var appBoundEncKey = Convert.FromBase64String(appBoundEncKeyB64).Skip(4).ToArray(); var appBoundDecodedKey = ProtectedData.Unprotect(appBoundEncKey, null, DataProtectionScope.LocalMachine);
错误信息:
at System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope) at Common.BrowserCookieReader.ReadCookieValue(String browserName, String browserCompanyName, String cookieName, String cookieHost, String username) System.Security.Cryptography.CryptographicException: 'Key not valid for use in specified state.'
已以管理员模式运行Visual Studio。
可能的原因及解决方案
1. 数据保护范围错误
Chrome的app_bound_encrypted_key是基于当前用户上下文加密的,而非机器全局。将DataProtectionScope.LocalMachine替换为DataProtectionScope.CurrentUser即可:
var appBoundDecodedKey = ProtectedData.Unprotect(appBoundEncKey, null, DataProtectionScope.CurrentUser);
这是此类问题最常见的诱因,Chrome针对用户级数据默认使用CurrentUser范围做DPAPI加密。
2. 前缀字节处理错误
确认app_bound_encrypted_key解码后的前4字节是否为DPAPI标准前缀(通常是01 00 00 00)。如果前缀长度不符,会导致解密失败。可以打印前4字节的十六进制值验证:
var prefix = Convert.FromBase64String(appBoundEncKeyB64).Take(4).ToArray(); Console.WriteLine(BitConverter.ToString(prefix));
若前缀长度不是4字节,调整Skip()的参数值。
3. 用户上下文不匹配
即便以管理员权限运行程序,若程序的用户身份和Chrome运行的用户身份不一致,DPAPI也无法跨用户解密。确保程序和Chrome运行在同一个用户账户下——哪怕需要管理员权限,也要用该用户身份启动Visual Studio。
4. 文件权限不足
除管理员权限外,需确保程序能读取Chrome的Local State文件(路径通常为C:\Users\<用户名>\AppData\Local\Google\Chrome\User Data\Local State),检查该文件的读取权限是否对当前程序开放。
5. Base64格式不兼容
部分场景下app_bound_encrypted_key会使用URL安全的Base64编码(用-替代+、_替代/),解密前需先转换为标准Base64格式:
appBoundEncKeyB64 = appBoundEncKeyB64.Replace('-', '+').Replace('_', '/'); // 补全Base64填充位 while (appBoundEncKeyB64.Length % 4 != 0) { appBoundEncKeyB64 += '='; }
内容的提问来源于stack exchange,提问作者Rougher

