Зашифрованные cookies в Chrome

В настоящее время я работаю над приложением C # forms, которому необходимо получить доступ к определенному файлу cookie на моем компьютере, и я могу делать все отлично. Вот вопрос:

Google хранит cookies в SQLite, и я загрузил браузер базы данных Sqlite, чтобы помочь мне взглянуть на эти значения. Меня удивляет то, что примерно половина значений cookie отображается как пустая (в том числе и та, которая мне нужна), хотя они, очевидно, нет.

Файл db находится по адресу:

C:\Users\%username%\AppData\Local\Google\Chrome\User Data\Default\Cookies 

В Chrome у меня есть аддон под названием «Edit This Cookie», который позволяет мне напрямую изменять cookies на веб-сайте, на котором я нахожусь. Этот аддон может читать эти куки-файлы, и веб-браузер может анализировать значения через HTTP, когда это необходимо для разных запросов, поэтому они определенно существуют. Тем не менее, браузер SQLite и мой пользовательский код приходят к выводу, что поле специального значения пустое ,

Почему это? Что это такое, что каким-то образом препятствует чтению поля определенными приложениями?

Я столкнулся с этой проблемой, и приведенный ниже код представляет собой рабочий пример для всех, кто заинтересован. Весь кредит для Шерлинга, поскольку DPAPI был на месте.

 public class ChromeCookieReader { public IEnumerable> ReadCookies(string hostName) { if (hostName == null) throw new ArgumentNullException("hostName"); var dbPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Google\Chrome\User Data\Default\Cookies"; if (!System.IO.File.Exists(dbPath)) throw new System.IO.FileNotFoundException("Cant find cookie store",dbPath); // race condition, but i'll risk it var connectionString = "Data Source=" + dbPath + ";pooling=false"; using (var conn = new System.Data.SQLite.SQLiteConnection(connectionString)) using (var cmd = conn.CreateCommand()) { var prm = cmd.CreateParameter(); prm.ParameterName = "hostName"; prm.Value = hostName; cmd.Parameters.Add(prm); cmd.CommandText = "SELECT name,encrypted_value FROM cookies WHERE host_key = @hostName"; conn.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var encryptedData = (byte[]) reader[1]; var decodedData = System.Security.Cryptography.ProtectedData.Unprotect(encryptedData, null, System.Security.Cryptography.DataProtectionScope.CurrentUser); var plainText = Encoding.ASCII.GetString(decodedData); // Looks like ASCII yield return Tuple.Create(reader.GetString(0), plainText); } } conn.Close(); } } } 

Хорошо, поэтому, если кто-то заинтересован, я нашел решение этой проблемы после многих проб, ошибок и поиска в Интернете.

БД Google cookie Google имеет 2 столбца для хранения значений: «значение» и «зашифрованное значение», последнее используется при сохранении зашифрованного файла cookie – часто это происходит с определенной конфиденциальной информацией и длительными сеансовыми ключами.

После выяснения этого я тогда должен был найти способ доступа к этому ключу, который хранится как значение Blob. Я нашел несколько руководств о том, как это сделать, но тот, который в итоге заплатил, был: http://www.codeproject.com/Questions/56109/Reading-BLOB-in-Sqlite-using-C-NET-CF- КПП

Простое чтение значения недостаточно, так как оно зашифровано. – Google Chrome использует тройное шифрование DES с текущим паролем пользователей как семя на машинах Windows. Чтобы расшифровать это на C #, следует использовать Windows Data Protection API (DPAPI), есть несколько руководств о том, как их использовать.

Как и ответ Джаспера, в сценарии PowerShell (конечно, настройте SQL-запрос для ваших нужд и путь к вашему местоположению файлов cookie):

 $cookieLocation = 'C:\Users\John\AppData\Local\Google\Chrome\User Data\Default\cookies' $tempFileName = [System.IO.Path]::GetTempFileName() "select writefile('$tempFileName', encrypted_value) from cookies where host_key = 'localhost' and path = '/api' and name = 'sessionId';" | sqlite3.exe "$cookieLocation" $cookieAsEncryptedBytes = Get-Content -Encoding Byte "$tempFileName" Remove-Item "$tempFileName" Add-Type -AssemblyName System.Security $cookieAsBytes = [System.Security.Cryptography.ProtectedData]::Unprotect($cookieAsEncryptedBytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser) $cookie = [System.Text.Encoding]::ASCII.GetString($cookieAsBytes) $cookie 
  # this powershell scripts exports your cookies to a format curl and wget understand # Obs ! Each profile has its own cookes file , replace me (ysg ;o) with your win usr name # aka wget -x --load-cookies cookies.txt http://stackoverflow.com/questions/22532870/encrypted-cookies-in-chrome $cookieLocation = 'C:\Users\ysg\AppData\Local\Google\Chrome\User Data\Profile 1\Cookies' $curl_cookies_file="C:\var\ygeo.reports.app.futurice.com.cookies.doc-pub-host.txt" $tempFileName1 = [System.IO.Path]::GetTempFileName() $tempFileName2 = [System.IO.Path]::GetTempFileName() # adjust your filter in the where clause ... "select writefile('$tempFileName1', encrypted_value) from cookies where host_key = '.futurice.com' ;" | sqlite3.exe "$cookieLocation" $cookieAsEncryptedBytes = Get-Content -Encoding Byte "$tempFileName1" Remove-Item "$tempFileName1" Add-Type -AssemblyName System.Security $cookieAsBytes = [System.Security.Cryptography.ProtectedData]::Unprotect($cookieAsEncryptedBytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser) $cookie = [System.Text.Encoding]::ASCII.GetString($cookieAsBytes) $unquoted_cookie=$cookie -replace '"', "" # adjust your filter in the where clause ... " select host_key , CASE WHEN httponly=0 THEN 'FALSE' ELSE 'TRUE' END , path , CASE WHEN secure=0 THEN 'FALSE' ELSE 'TRUE' END , expires_utc , name , '$unquoted_cookie' from cookies where host_key = '.futurice.com' ;" | sqlite3.exe -separator " " "$cookieLocation" > $curl_cookies_file Get-ChildItem *.txt | ForEach-Object { (Get-Content $_) | Out-File -Encoding ASCII $_ } # check the meta data table #"PRAGMA table_info([cookies]);" | sqlite3.exe "$cookieLocation" # src: https://github.com/daftano/cookies.txt/blob/master/src/popup.js #content += escapeForPre(cookie.domain); #content += "\t"; #content += escapeForPre((!cookie.hostOnly).toString().toUpperCase()); #content += "\t"; #content += escapeForPre(cookie.path); #content += "\t"; #content += escapeForPre(cookie.secure.toString().toUpperCase()); #content += "\t"; #content += escapeForPre(cookie.expirationDate ? Math.round(cookie.expirationDate) : "0"); #content += "\t"; #content += escapeForPre(cookie.name); #content += "\t"; #content += escapeForPre(cookie.value); #content += "\n"; # #0|creation_utc|INTEGER|1||1 #1|host_key|TEXT|1||0 #2|name|TEXT|1||0 #3|value|TEXT|1||0 #4|path|TEXT|1||0 #5|expires_utc|INTEGER|1||0 #6|secure|INTEGER|1||0 #7|httponly|INTEGER|1||0 #8|last_access_utc|INTEGER|1||0 #9|has_expires|INTEGER|1|1|0 #10|persistent|INTEGER|1|1|0 #11|priority|INTEGER|1|1|0 #12|encrypted_value|BLOB|0|''|0 #13|firstpartyonly|INTEGER|1|0|0 

Поэтому я хотел сделать это, не вписываясь в tempfile каждый раз, но также не применяя отдельный class в соответствии с решением яшмы. Как яшма , мне стало проще и быстрее получить доступ к System.Data.SQLite.dll, доступному здесь . Это не так элегантно, как отдельный class, но для меня это лучше всего работает:

 Add-Type -AssemblyName System.Security Add-Type -Path 'C:\Program Files\System.Data.SQLite\2015\bin\x64\System.Data.SQLite.dll' Function Get-Last-Cookie { Param( [Parameter(Mandatory=$True)] $valueName, [Parameter(Mandatory=$True)] $hostKey, [Parameter(Mandatory=$True)] $dbDataSource ) $conn = New-Object -TypeName System.Data.SQLite.SQLiteConnection $conn.ConnectionString = "Data Source=$dbDataSource" $conn.Open() $command = $conn.CreateCommand() $query = "SELECT encrypted_value FROM cookies WHERE name='$valueName' ` AND host_key='$hostKey' ORDER BY creation_utc DESC LIMIT 1" $command.CommandText = $query $adapter = New-Object -TypeName System.Data.SQLite.SQLiteDataAdapter $command $dataset = New-Object System.Data.DataSet [void]$adapter.Fill($dataset) $command.Dispose(); $conn.Close(); $cookieAsEncryptedBytes = $dataset.Tables[0].Rows[0].ItemArray[0] $cookieAsBytes = [System.Security.Cryptography.ProtectedData]::Unprotect($cookieAsEncryptedBytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser) return [System.Text.Encoding]::ASCII.GetString($cookieAsBytes) } $localAppDataPath = [Environment]::GetFolderPath([Environment+SpecialFolder]::LocalApplicationData) $cookieDbPath = 'Google\Chrome\User Data\Default\Cookies' $dbDataSource = Join-Path -Path $localAppDataPath -ChildPath $cookieDbPath $plainCookie = Get-Last-Cookie 'acct' '.stackoverflow.com' $dbDataSource Write-Host $plainCookie 

Я также нашел функцию Add-SqliteAssembly halr9000 очень полезной, когда пришло время запланировать мой скрипт в планировщике задач Windows и понял, что планировщик задач запускает версию PowerShell x86 и, следовательно, SQLite, а не x64, который я использовал в консоль.

Просто установите «значение» в cookie, который вы хотите, «encrypted_value» в NULL, а «priority» – 0

  • Исключение блокировки базы данных SQLite
  • Как получить список имен столбцов на sqlite3 / iPhone?
  • Как создать базу данных в android?
  • обновить базу данных sql с помощью ContentValues ​​и метода обновления
  • Получить последнее вставленное значение из базы данных sqlite Android
  • Любые хорошие инструменты ORM для разработки Android?
  • Ограничение таблицы SQLite - уникальное по нескольким столбцам
  • SQLite с поддержкой readline на Ubuntu
  • Android - вытащить Android-устройство SQlite
  • Как хранить базу данных sqlite непосредственно на SD-карте
  • Удаление строки в SQLite на Android
  • Interesting Posts

    Установите приложения тихо, с предоставленным разрешением INSTALL_PACKAGES

    Создание оглавления для XWPFDocument с указанием номеров страниц

    Анализ HTML для получения контента с использованием C #

    Средство развертывания Office не распознает загруженные файлы установки и пытается повторно загрузить

    Инъекция зависимостей против местоположения службы

    Как отобразить всплывающее окно из WebBrowser в другом окне, которое я создал?

    Могу ли я делать запросы POST или GET из приложения iphone?

    iOS 10: «, если мы находимся в реальном обработчике pre-commit, мы фактически не можем добавлять никаких новых ограждений из-за ограничения CA»

    Он открывает приглашение «открыть с» при каждом запуске запланированного задания

    Прочитайте stream дважды

    Почему обработчик события щелчка сразу срабатывает при загрузке страницы?

    Открыть и выбрать файл в существующем окне проводника

    Как узнать, поддерживает ли моя материнская плата память DDR2 или DDR3?

    MVC3 и First First Migrations – «модель, поддерживающая контекст« blah », изменилась с момента создания базы данных»

    Чтение из текстового файла до тех пор, пока EOF не повторит последнюю строку

    Давайте будем гением компьютера.