Расшифровать файлы cookie с расширением Chrome BLOB в Python

У меня есть Chrome 33+ в Ubuntu, и я вижу, что файлы cookie зашифрованы в структуре BLOB:

CREATE TABLE cookies (creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY,host_key TEXT NOT NULL,name TEXT NOT NULL,value TEXT NOT NULL,path TEXT NOT NULL,expires_utc INTEGER NOT NULL,secure INTEGER NOT NULL,httponly INTEGER NOT NULL,last_access_utc INTEGER NOT NULL, has_expires INTEGER NOT NULL DEFAULT 1, persistent INTEGER NOT NULL DEFAULT 1,priority INTEGER NOT NULL DEFAULT 1,encrypted_value BLOB DEFAULT '');

Я хотел бы написать python script для дешифрования файла cookie. Я видел, что есть проблема Cookie с Chrome 33 Beta, но полагается в CryptUnprotectData, что это Windows API.

Прежде всего, я хотел бы знать, как шифруются файлы cookie. Я прочитал 3DES и AES, но я не нашел надежного источника для получения информации.

Я напишу код, чтобы сделать необходимое шифрование и дешифрование, если у меня есть информация о том, как это сделать.

Спасибо

Ответ 1

Я опубликовал пример Python script здесь для декодирования зашифрованных файлов cookie в OSX или Linux.

Ответ 2

Я тоже работаю над этим. До сих пор я обнаружил, что Chrome (Windows) использует функцию CryptProtectData для шифрования значений cookie. Та же самая функция, которую он использовал для шифрования сохраненных паролей в файле данных входа. CryptProtectData использует данные учетной записи пользователя и пароль зарегистрированного пользователя Windows для шифрования данных. Чтобы расшифровать его, мы должны использовать функцию CryptUnProtectData с той же учетной записью пользователя.

Вот фрагмент для дешифрования данных входа https://gist.github.com/jordan-wright/5770442

Теперь о Linux я читал здесь:  http://www.linkedin.com/groups/Google-Chrome-encrypt-Stored-Cookies-36874.S.5826955428000456708

"на других системах, похоже, запутывает пароли с солью" saltysalt "и паролем" арахисы ""

Ответ 3

Комментарии немного сбивают с толку, поэтому просто уточнить, это источник хрома в os_crypt_win.cc, поэтому вы можете видеть, что он просто помещает строку в blob и запускает CryptUnprotectData()

bool OSCrypt::DecryptString(const std::string& ciphertext,
                            std::string* plaintext) {
  DATA_BLOB input;
  input.pbData = const_cast<BYTE*>(
      reinterpret_cast<const BYTE*>(ciphertext.data()));
  input.cbData = static_cast<DWORD>(ciphertext.length());

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

  plaintext->assign(reinterpret_cast<char*>(output.pbData), output.cbData);
  LocalFree(output.pbData);
  return true;
}