Как мне хранить ключи API в приложении Python?

В моем случае я использую API Dropbox. В настоящее время я храню ключ и секрет в файле JSON, просто чтобы я мог игнорировать его и хранить вне репозитория Github, но, очевидно, это не лучше, чем иметь его в коде с точки зрения безопасности. Раньше было много вопросов о защите/обфускации Python (обычно по коммерческим причинам), и ответ всегда был «Не надо, Python не предназначен для этого».

Таким образом, я ищу не способ защиты кода, а просто решение, которое позволит мне распространять свое приложение, не раскрывая деталей своего API.


person lavelle    schedule 27.04.2012    source источник
comment
поместите их в текстовый файл как зашифрованные значения. Создайте секретный ключ шифрования и расшифруйте его при необходимости. Хотя может быть и лучший способ, но этот способ хорошо работал для меня в прошлом.   -  person Mike McMahon    schedule 27.04.2012
comment
Если кто-то запускает программу на своем компьютере, и программа использует ключ, это практически раскрывается. Не нужно быть гением, чтобы запустить WireShark, позволить программе подключиться и отфильтровать захват для подключений к Dropbox (или по какому-либо другому критерию — в худшем случае вы копаетесь в нескольких сотнях пакетов). И простое запутывание программы ничего вам не купит, так как вы не можете изменить строковый литерал, которым является ключ API, иначе это будет бесполезно для вашей программы.   -  person    schedule 28.04.2012
comment
@delnan Но будет ли ключ API виден в HTTP-трафике? Dropbox делает все через SSL. Я не знаю, используют ли они переменные GET или POST или просто помещают их в заголовки HTTP-запроса. Эти вещи зашифрованы в HTTPS-запросе или просто в теле запроса?   -  person lavelle    schedule 29.04.2012
comment
Если окажется, что вы не можете обнаружить их с помощью перехвата пакетов, тогда единственная проблема - это их локальная копия, и идея @Mike McMahon по их шифрованию кажется стоящей попытки.   -  person lavelle    schedule 29.04.2012
comment
Я отказываюсь верить, что их невозможно защитить, иначе зачем существуют API-ключи?   -  person lavelle    schedule 29.04.2012
comment
HTTPS действительно должен исключить эту часть, извините за путаницу. Тем не менее, в какой-то момент программа должна иметь в памяти простой текстовый ключ, хотя бы для того, чтобы отправить его (и зашифровать его с помощью SSL). Это может быть сложнее, но опытный злоумышленник все равно сможет ухватиться за него. Люди также продолжают побеждать DRM и защиту от копирования. Основной выход — контролировать все соответствующие части, т. е. иметь сервер. Существует множество веб-сайтов, которые имеют доступ, например. API карт Google (предположительно, с ключом API), но я не знаю ни одного настольного приложения, которое это делает.   -  person    schedule 29.04.2012
comment
Да, я думаю, что в конечном итоге он никогда не будет полностью безопасным, поэтому лучшее, на что вы можете надеяться, это сделать его настолько сложным, что это не стоит усилий злоумышленника. Очевидно, что моя программа не является высококлассной мишенью для атаки, но этот проект больше посвящен изучению концепций.   -  person lavelle    schedule 29.04.2012
comment
Насколько я понимаю, ключи API существуют для обеспечения некоторого контроля на уровне приложения для Dropbox (компании). Но, как указали несколько человек, защитить их абсолютно невозможно. Лучшее, что вы можете сделать, это запутать их.   -  person Jeff    schedule 16.05.2012
comment
Проблема, похоже, та же, что и при хранении ключей API для клиентских библиотек Python. См. этот ответ, я думаю, что он применим в равной степени.   -  person smarie    schedule 02.03.2020


Ответы (3)


Простой текст. Любая попытка обфускации бесполезна, если код распространяется.

person orlp    schedule 27.04.2012

Не знаю, возможно ли это в вашем случае. Но вы можете получить доступ к API через прокси, который вы размещаете.

Запросы от приложения Python отправляются на прокси-сервер, а прокси-сервер отправляет запросы к API Dropbox и возвращает ответ приложению Python. Таким образом, ваш ключ API будет находиться на прокси-сервере, который вы размещаете. Доступ к прокси можно контролировать любым удобным для вас способом. (Например, имя пользователя и пароль)

person Can't Tell    schedule 28.04.2012
comment
В общем, это хорошее решение, но в моем случае я выбрал именно Dropbox, потому что у меня нет ни ресурсов, ни желания размещать собственный сервер, я просто хотел сосредоточиться на создании клиента. - person lavelle; 28.04.2012

Есть два способа в зависимости от вашего сценария:

Если вы разрабатываете веб-приложение для конечных пользователей, просто разместите его таким образом, чтобы ваш ключ API не был раскрыт. Поэтому хранить его в отдельном файле и загружать только на свой сервер должно быть нормально (если на вашем сервере нет взлома). Любая запутанность не добавит практической пользы, а только создаст ложное ощущение безопасности.

Если вы разрабатываете фреймворк/библиотеку для разработчиков или клиентское приложение для конечных пользователей, попросите их сгенерировать ключ API самостоятельно.

person schlamar    schedule 18.06.2012