我目前正在开发一个C#表单应用程序,它需要访问我计算机上的特定cookie,我可以做得很好。问题是这样的:
Google将Cookie存储在SQLite中,我下载了SQLite数据库浏览器来帮助我查看这些值。令我惊讶的是,大约有一半的cookie值显示为空(包括我需要的那个),尽管它们显然不是。
db文件位于:
C:\Users\%username%\AppData\Local\Google\Chrome\User Data\Default\Cookies
在Chrome上,我有一个名为“编辑此Cookie”的插件,它允许我直接修改我所在网站上的Cookie。这个插件可以读取这些cookie,当不同的请求需要时,Web浏览器可以通过HTTP解析值,所以它们肯定在那里-仍然,SQLite浏览器和我的自定义代码都得出结论,特定的值字段是空的。
为什么会这样?是什么以某种方式阻止了某些应用程序读取该字段?
7条答案
按热度按时间rjjhvcjd1#
我也遇到过同样的问题,下面的代码为任何感兴趣的人提供了一个工作示例。所有的信贷Scherling,因为DPAPI是现场。
ecr0jaav2#
好吧,如果有人感兴趣,我发现了一个解决这个问题后,大量的试验,错误和谷歌搜索。
Google Chrome cookies数据库有两列用于存储值:“value”和“encrypted_value”,后者用于请求加密存储的cookie时-通常是某些机密信息和长期会话密钥的情况。
弄清楚这一点之后,我需要找到一种方法来访问这个键,它存储为一个Blob值。我找到了几个关于如何做到这一点的指南,但最终得到回报的是:http://www.codeproject.com/Questions/56109/Reading-BLOB-in-Sqlite-using-C-NET-CF-PPC
仅仅阅读值是不够的,因为它是加密的。- 谷歌Chrome使用三重DES加密,当前用户的密码作为Windows机器上的种子。为了在C#中解密,应该使用Windows数据保护API(DP API),有一些关于如何使用它的指南。
sxissh063#
就像碧玉的答案一样,在PowerShell脚本中(当然,根据您的需要定制SQL查询,以及Cookie位置的路径):
f0ofjuux4#
问题是,谷歌Chrome加密了你需要读取的数据,所以你必须解密它。首先,获取cookie文件的副本。然后使用SQLite3读取它。之后,获取加密的字节。最后,使用下面的代码来解密它。你需要这些Nugets:
到目前为止的代码:
//非常感谢https://stackoverflow.com/a/60611673/6481581回答了Chrome 80及以上版本如何改变了cookie的加密方式。
yyyllmsg5#
所以我想这样做,而不是每次都写一个临时文件,也没有实现一个单独的类,按照碧玉的解决方案。像jasper一样,我发现访问here可用的System.Data.SQLite.dll更容易、更快。它不像一个单独的类那样优雅,但它对我来说是最好的:
我还发现halr9000的Add-SqliteAssembly函数在Windows任务调度程序中调度我的脚本时非常有用,并意识到任务调度程序运行x86版本的PowerShell,因此SQLite而不是我在控制台中使用的x64。
laik7k3q6#
um6iljoc7#
只需将“value”设置为您想要的cookie,“encrypted_value”设置为NULL,“priority”设置为0