Как программно извлечь пароли из Chrome на Python: пошаговое руководство по дешифровке

    📝 Кратко: Браузеры на базе Chromium надежно защищают данные, но с помощью Python мы можем программно получить доступ к своим учетным записям и паролей в Chrome . Мы разберем алгоритм расшифровки ключа через DPAPI и работу с зашифрованными хранилищами AES-256-GCM.
Как программно извлечь пароли из Chrome на Python

Привет! Знаете, бывает такая ситуация: вы написали отличный скрипт для автоматизации, которому нужно залогиниться на десятке сервисов, но вспоминать и вбивать все пароли вручную — это просто мучение. Или, что еще хуже, вы забыли пароль от старого рабочего кабинета, который сохранен только в браузере, а «глазик» в настройках Chrome почему-то не помогает. Я сам однажды попал в такую ловушку и решил разобраться, как же на самом деле браузер хранит наши секреты.

Оказалось, что за простым списком в настройках стоит целая система из баз данных SQLite и продвинутого шифрования AES-256. В этой статье я не просто дам вам готовый скрипт, а пошагово разберу, как выполнить извлечение паролей Chrome с помощью Python, чтобы вы понимали каждое действие — от поиска мастер-ключа до расшифровки байтов.
Поехали!

Как Chrome хранит ваши пароли на самом деле?

Прежде чем приступать к коду, нужно понять архитектуру хранения. Многие думают, что Chrome хранит пароли в открытом виде или в простом текстовом файле. Это не так. Все ваши логины и пароли записываются в базу данных SQLite, которая обычно называется Login Data. Однако поле с паролем там зашифровано.

Начиная с 80-й версии Chrome, механизм защиты значительно усложнился: теперь используется алгоритм AES-256-GCM, а ключ для него, в свою очередь, зашифрован системным механизмом Windows под названием DPAPI (Data Protection API). Это означает, что даже если кто-то украдет файл вашей базы данных, он не сможет прочитать пароли на другом компьютере без вашего мастер-ключа, привязанного к учетной записи Windows.

Процесс, который мы называем извлечение паролей Chrome Python, состоит из трех критических этапов. Сначала нам нужно найти файл Local State, в котором хранится зашифрованный мастер-ключ. Затем мы должны расшифровать этот ключ, используя функции операционной системы. И только после этого мы сможем открыть базу данных Login Data, считать оттуда зашифрованные строки и превратить их в читаемый текст.

Это отличный пример того, как современное ПО балансирует между удобством пользователя (автозаполнение) и безопасностью данных. Если вы уже читали наши 10 ошибок новичков в Python, то знаете, что безопасность — это то, на чем нельзя экономить.

📚 Документация: sqlite3 — DB-API 2.0 interface for SQLite «Модуль sqlite3 предоставляет интерфейс SQL, соответствующий спецификации DB-API 2.0. Он позволяет работать с локальными базами данных без необходимости установки полноценного сервера БД».

Подготовка библиотек и окружения

Для реализации нашего скрипта нам понадобятся инструменты, которые умеют работать с системными вызовами Windows и криптографией. Мы будем использовать pycryptodome для дешифровки AES и pypiwin32 для взаимодействия с API Windows. Эти библиотеки не входят в стандартный набор Python, поэтому их нужно установить. Я рекомендую использовать современный подход к управлению зависимостями. Если вы пропустили наш обзор, обязательно посмотрите, как работает uv — пакетный менеджер, чтобы установка библиотек занимала доли секунды.

Выполните команду в терминале: pip install pycryptodome pypiwin32

Помимо этого, нам понадобятся стандартные модули os, json, base64 и sqlite3. Важный нюанс: так как Chrome блокирует файл базы данных, пока он открыт, нам придется создавать временную копию этого файла. Для работы с путями мы будем использовать pathlib, так как это стандарт индустрии. Вы можете найти полезные python pathlib примеры в нашей предыдущей статье, чтобы лучше ориентироваться в структуре папок Windows.

Шаг 1: Получение и расшифровка мастер-ключа

Ключ, которым зашифрованы все ваши пароли, лежит в файле Local State. Это обычный JSON-файл, но поле os_crypt -> encrypted_key содержит данные, зашифрованные через DPAPI. Чтобы их расшифровать, мы воспользуемся функцией CryptUnprotectData. Это системная функция Windows, которая позволяет расшифровать данные, зашифрованные текущим пользователем. Это гарантирует, что только вы (или программа, запущенная от вашего имени) сможете получить этот ключ.

Код для извлечения ключа

import os
import json
import base64
import win32crypt
from pathlib import Path

def get_encryption_key():
    # Путь к файлу Local State
    local_state_path = Path(os.environ["USERPROFILE"]) / \
        "AppData" / "Local" / "Google" / "Chrome" / "User Data" / "Local State"
    
    with open(local_state_path, "r", encoding="utf-8") as f:
        local_state = json.load(f)

    # Извлекаем ключ и декодируем из Base64
    encrypted_key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])
    
    # Удаляем префикс 'DPAPI' (первые 5 байт)
    encrypted_key = encrypted_key[5:]
    
    # Расшифровываем ключ через Windows API
    master_key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
    return master_key

Объяснение кода:

  • os.environ["USERPROFILE"]: Мы динамически получаем путь к папке текущего пользователя. Это делает скрипт универсальным для любой системы Windows.
  • base64.b64decode: Ключ в JSON-файле хранится в текстовом виде (Base64), нам нужно превратить его обратно в байты для обработки.
  • encrypted_key[5:]: Chrome добавляет метку «DPAPI» в начало зашифрованного ключа. Нам она не нужна для дешифровки, поэтому мы просто отрезаем первые 5 символов.
  • win32crypt.CryptUnprotectData: Самая важная часть. Эта функция использует ваши системные учетные данные для расшифровки мастер-ключа. Она вернет кортеж, где второй элемент — это и есть наш «чистый» ключ.

Шаг 2: Работа с базой данных Login Data

Теперь, когда у нас есть ключ, пора заглянуть в саму базу паролей. Она находится в папке профиля (обычно Default). Как я уже говорил, мы не можем просто открыть её, если Chrome запущен, поэтому мы создадим копию во временной папке. База данных SQLite содержит таблицу logins, в которой нас интересуют три поля: origin_url (адрес сайта), username_value (логин) и password_value (зашифрованный пароль).

📚 Документация: pycryptodome — AES-GCM encryption «Режим GCM (Galois/Counter Mode) обеспечивает как конфиденциальность, так и аутентификацию данных. Chrome использует его для защиты паролей с 256-битным ключом».

Код для чтения базы данных

import sqlite3
import shutil

def get_db_connection():
    db_path = Path(os.environ["USERPROFILE"]) / \
        "AppData" / "Local" / "Google" / "Chrome" / "User Data" / "Default" / "Login Data"
    
    # Создаем временную копию, чтобы не мешать браузеру
    filename = "ChromeData.db"
    shutil.copyfile(db_path, filename)
    
    return sqlite3.connect(filename)

# Пример запроса
# db = get_db_connection()
# cursor = db.cursor()
# cursor.execute("SELECT origin_url, username_value, password_value FROM logins")

Использование shutil.copyfile — это критически важный момент. Без этого ваш скрипт выдаст ошибку sqlite3.OperationalError: database is locked, если пользователь в этот момент пользуется интернетом. Это правило хорошего тона в разработке инструментов автоматизации. Если вы стремитесь писать чистый код на Python, всегда учитывайте возможные блокировки ресурсов операционной системой.

Шаг 3: Расшифровка пароля (AES-256-GCM)

Это технически самая сложная часть задачи извлечение паролей Chrome Python. Зашифрованный пароль в базе данных имеет специфическую структуру. Первые 3 байта — это префикс версии (обычно v10). Следующие 12 байт — это так называемый Initialization Vector (IV) или «соль» для алгоритма AES. Оставшаяся часть — это сам зашифрованный пароль и тег аутентификации. Нам нужно правильно «нарезать» эти байты и передать их в библиотеку pycryptodome.

Процесс дешифровки выглядит так: мы берем мастер-ключ, берем IV из пароля и инициализируем шифр AES в режиме GCM. После этого мы получаем чистый текст, который можно вывести на экран или сохранить в файл. Этот метод гораздо надежнее старых способов, и именно поэтому Chrome считается одним из самых безопасных браузеров в плане локального хранения.

from Crypto.Cipher import AES

def decrypt_password(password, key):
    try:
        # Извлекаем IV (12 байт после префикса v10)
        iv = password[3:15]
        # Извлекаем зашифрованные данные (после IV)
        payload = password[15:]
        
        # Настраиваем шифр
        cipher = AES.new(key, AES.MODE_GCM, iv)
        
        # Расшифровываем и декодируем в строку
        decrypted_pass = cipher.decrypt(payload)[:-16].decode()
        return decrypted_pass
    except Exception as e:
        return f"Ошибка расшифровки: {e}"

Объяснение кода:

  • password[3:15]: Мы пропускаем префикс «v10» и забираем следующие 12 байт, которые нужны для настройки алгоритма.
  • cipher.decrypt(payload)[:-16]: Алгоритм AES-GCM добавляет в конец 16-байтовый тег проверки целостности. Нам он не нужен для получения текста, поэтому мы его отбрасываем.
  • .decode(): На выходе мы получаем байты, которые легко превращаются в обычную строку UTF-8.

Полный код проекта: Собираем всё вместе

Теперь давайте объединим все функции в один мощный скрипт. Этот инструмент автоматически найдет все файлы, расшифрует ключ и выведет список всех ваших сохраненных паролей. Вы можете использовать этот код как основу для своего менеджера паролей или скрипта для автоматического бэкапа данных. Это полноценная реализация по теме извлечение паролей Chrome на Python, написанная с учетом всех современных требований к безопасности и архитектуре.

import os
import json
import base64
import sqlite3
import shutil
import win32crypt
from Crypto.Cipher import AES
from pathlib import Path

def get_encryption_key():
    local_state_path = Path(os.environ["USERPROFILE"]) / \
        "AppData" / "Local" / "Google" / "Chrome" / "User Data" / "Local State"
    with open(local_state_path, "r", encoding="utf-8") as f:
        local_state = json.load(f)
    encrypted_key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])[5:]
    return win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]

def decrypt_password(password, key):
    try:
        iv = password[3:15]
        payload = password[15:]
        cipher = AES.new(key, AES.MODE_GCM, iv)
        return cipher.decrypt(payload)[:-16].decode()
    except:
        return ""

def main():
    key = get_encryption_key()
    db_path = Path(os.environ["USERPROFILE"]) / \
        "AppData" / "Local" / "Google" / "Chrome" / "User Data" / "Default" / "Login Data"
    
    temp_db = "temp_login_data.db"
    shutil.copyfile(db_path, temp_db)
    
    conn = sqlite3.connect(temp_db)
    cursor = conn.cursor()
    cursor.execute("SELECT origin_url, username_value, password_value FROM logins")
    
    for url, user, pwd in cursor.fetchall():
        if user:
            decrypted_pwd = decrypt_password(pwd, key)
            print(f"Сайт: {url}\nЛогин: {user}\nПароль: {decrypted_pwd}\n{'-'*20}")
            
    cursor.close()
    conn.close()
    os.remove(temp_db)

if __name__ == "__main__":
    main()

Этические и технические нюансы

Важно понимать, что извлечение паролей Chrome используя Python — это инструмент, который должен использоваться только в благих целях. Вы можете использовать его для восстановления собственных данных или в рамках аудита безопасности вашей компании. Никогда не применяйте подобные скрипты к чужим данным без разрешения — это не только неэтично, но и преследуется по закону.

С технической стороны стоит отметить, что если в Chrome настроен «Мастер-пароль» (редкая, но существующая функция) или если данные синхронизированы с аккаунтом Google с дополнительным шифрованием, стандартный метод может потребовать доработки. Однако для 95% обычных установок Chrome на Windows этот код сработает идеально. Если вы планируете использовать этот скрипт в связке с веб-интерфейсом, рекомендую изучить тему работа с FastAPI Python, чтобы безопасно передавать полученные данные внутри вашей сети.

Заключение

Мы прошли путь от зашифрованного JSON-файла до получения реальных паролей в виде обычного текста. Извлечение паролей Chrome с помощью Python — это отличный способ глубже понять, как работают современные системы защиты данных и как Python может взаимодействовать с низкоуровневым API Windows. Теперь у вас есть мощный инструмент для автоматизации и восстановления доступа. Главное — используйте эти знания с умом и всегда уделяйте внимание безопасности своих собственных приложений.

Помните, что лучший способ защитить пароли — это использовать менеджеры паролей с двухфакторной аутентификацией, но уметь «заглянуть под капот» любимого браузера — это навык, который отличает простого кодера от настоящего профессионала. Удачи в изучении Python и безопасной вам автоматизации!

🔁 Если вам полезны советы по Python, посмотрите также:
Python-скрипт для бэкапа Chrome и Firefox — автоматизируйте сохранение всего профиля браузера
Python pathlib: примеры работы — научитесь профессионально управлять путями к файлам
Как писать чистый и читаемый код на Python — сделайте ваши системные скрипты идеальными
💬 Остались вопросы? Пишите в комментариях — с радостью уточню, дополню или помогу с вашим кодом.
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и разные трюки на Python.
👉 Ваш интерес — лучшая мотивация для новых статей!

Оставьте комментарий