Как я могу скрыть конфиденциальные данные в моем проекте с открытым исходным кодом?


13

У меня есть проект с открытым исходным кодом, который загружает файлы в DropBox среди нескольких файловых хостов. Прямо сейчас я делаю скриншот для DropBox. Чтобы использовать их API, я должен жестко закодировать СЕКРЕТНЫЙ КЛЮЧ, предоставленный мне для аутентификации OAuth. Но я боюсь, что ключ не будет секретным, если он будет виден всем.

Кто-то злоумышленник может использовать мой ключ для загрузки вируса в учетную запись пользователя (который уже разрешил доступ к моему приложению), который будет распространяться на его компьютер (если у него включена синхронизация на рабочем столе) и на компьютер других (если у них были общие папки) и так далее. : O

Я нашел этот вопрос без ответа, который имеет ту же проблему, что и мой.

Но я хотел бы знать, как в целом скрыть конфиденциальные данные в проекте с открытым исходным кодом.

У меня есть одна идея.

  • Есть заполнитель в исходном коде, например "<SECRET KEY HERE>", и заполните его только при сборке двоичного кода для выпуска? (Тьфу!)

Любая приличная идея?


1
Это действительно единственный безопасный способ сделать это. Вы можете также использовать шифрование pgp для кодирования своего секретного ключа, тогда только вы можете декодировать его, но зачем вообще его публиковать.
— Прескотт

Возможно, стоит проверить этот вопрос: programmers.stackexchange.com/questions/180957/… - речь идет не о ключах API DropBox, но общее сообщение такое же.
— tdammers

git-crypt был создан для вас :) github.com/AGWA/git-crypt
— nha

Ответы:


14

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

Заполнители в коде (жестко закодированные значения)

Заполнители в коде - как было предложено - что наиболее разумно и проще всего сделать в динамических языках программирования, так как код легко изменить (без необходимости компиляции). Я видел много проектов с открытым исходным кодом, таких как MediaWiki с этим LocalSettings.php.

Недостаток этой стратегии является то , что ключ зашит. Таким образом, если программа распространяется в виде двоичного файла, то жестко закодированный ключ не делает ее особенно удобной для сопровождения.

Конфигурационные текстовые файлы

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

В вашем случае вы можете создать key.confтекстовый файл с фактическим ключом, позволить программе использовать этот файл и позволить ему игнорировать управление версиями. Для удобства вы можете проверить key.conf.exampleтекстовый файл с помощью фиктивной клавиши и проверить это. Убедитесь, что ваша программа / приложение делает полезное сообщение об ошибке для пользователя, чтобы добавить фактический ключ в правильный файл.

Некоторые языки программирования имеют API, которые предоставляют это автоматически, например:

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

Через просмотр настроек или приложение бэк-офиса

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

MediaWiki решает эту проблему аналогичным образом, автоматически генерируя LocalSettings.phpфайл в процессе первоначальной установки.

По общему признанию, это не вариант для программ, которые работают исключительно как фоновые процессы, сервисы или демоны. Однако именно поэтому вы создаете отдельные проекты с графическим интерфейсом для них, чтобы создать точку входа для настроек администрирования и настроек, в веб-приложениях, обычно называемых приложением Back Office .


Здесь следует отметить одну вещь: если само приложение изменяет свои собственные параметры конфигурации, это означает, что пользователь должен записать файл настроек, что, в свою очередь, увеличивает поверхность атаки, поэтому вам следует подумать, действительно ли вам нужен такой интерфейс.
— tdammers

2

Самый простой способ - просто не публиковать конфиденциальные данные. Некоторые варианты:

  • Используйте заполнитель, как в вопросе.
  • Используйте заголовочный файл специально для ключа, не передавайте его в систему контроля версий и распространяйте его только конфиденциально среди доверенных сторон.

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


2

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

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

Единственный безопасный способ, который я могу придумать, - это предоставить веб-сервис, который отправляет сообщения в раскрывающийся список. Таким образом, секретный ключ остается на вашем сервере под вашим контролем. Расходы на хостинг и пропускную способность означают, что это решение далеко не идеально для бесплатного приложения, но дополнительным преимуществом является то, что ваш сервер может правильно аутентифицировать клиентов перед передачей их файлов, отправляемых в Dropbox.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.