2014-01-14 3 views
7

Я бы хотел (PGP/GPG) подписать код питона. Да, я прочитал this и многие другие сайты, которые говорят о , защищающие и obfuscating код python - это все не что я хочу. Я НЕ хочу обфускать код. Я хочу, чтобы клиенты и пользователи могли видеть код, они могли изменять код, копировать его и выполнять производные работы, я хотел бы иметь программное обеспечение под GPLv3. Но я хочу иметь плагины, которые «подписаны», поэтому они могут быть от доверенными во время исполнения.PGP/GPG Подписан код Python

Возможно ли это в Python? Можно ли импортировать библиотеку после проверки ее подписи? Что было бы просто: проверьте подпись gpg файла, а затем загрузите его с помощью импорта, иначе создайте исключение. Но это возможно только для файлов с одним файлом, а не с файлами python.

Понятно, что если клиент изменяет ключ GPG в программе или удаляет некоторые строки в алгоритме проверки, все исчезло - но это не проблема. Он мог делать все, что захочет, но это было бы глупо. То, что он хочет, - это достоверность. Я хочу, чтобы он добавил плагин для сторонних разработчиков, скопировав его в каталог «plugins», и попросите программу проверить плагин на «достоверность», а затем импортировать его. (Так он мог запускать плагины, которые не подписал, но со своим собственным риском.)

+2

Я считаю, что вы должны тщательно проверить систему 'import' (http://docs.python.org/3/reference/import.html) на python, поскольку она позволяет вам писать пользовательские [импортные крючки] (http : //www.python.org/dev/peps/pep-0302/). Что бы я сделал: предоставить плагины как 'zip' файлы, содержащие модули/пакеты * и * подпись. Затем импорт сначала проверит подпись, и если это будет правильно, он может распаковать архив во временный каталог и импортировать модули оттуда ([или непосредственно из 'zip'] (http://docs.python.org/ 2/библиотека/zipimport.html)). Пользователи могут распаковать архив и изменить его. – Bakuriu

+0

@Bakuriu отличный комментарий, и это должен быть ответ. –

+0

Это то, что я думал и раньше, используя zip-файл. Это была бы одна из моих функций: загрузить подписанный файл zip/other «plugin package» с выделенного сервера, проверить gpg, распаковать его. Итак, «установка» в выделенный «плагины» должна выполняться программным обеспечением, тогда проблема будет решена, если я правильно понял. Администратор в системе обходит это, изменяя код как root. И я не знал об импортных крючках, спасибо очень. – nerdoc

ответ

4

Питона import mechanism уже предоставляют все инструменты, необходимые для достижения того, что вы хотите. Вы можете установить различные типы import hooks, чтобы поддерживать то, что вы хотите.

В частности, вы, вероятно, найдете удобным установить meta path hook, который ищет «подписанные модули» и возвращает Loader, который может выполнять импорт из этого подписанного формата.

Очень простой и удобный формат для подписанных плагинов будет zip архив, содержащий:

  1. Код плагина в виде модулей/пакетов
  2. ПФГ подпись приведенный выше код

Таким образом:

  • Ваш погрузчик должен ип упаковать почтовый индекс и проверить подпись. Если это соответствует, то вы можете безопасно загрузить подключаемый модуль, если он не соответствует, вы должны попросить пользователя доверять подключаемому модулю (или нет и прервать)
  • Если пользователь хочет изменить подключаемый модуль, может просто распаковать архив zip и изменить его, как он пожелает.
  • Импорт из архивов zip уже реализован в модуле zipimport. Это означает, что вам не нужно переписывать загрузчик с нуля.

На самом деле, если вы хотите, чтобы уменьшить код для крючков к минимуму вы просто должны проверить подпись, а затем добавьте путь к zip архива в sys.path, так как питон уже обрабатывает импорт из zip архива даже без явного использования zipimport.

Используя этот дизайн, вам просто нужно установить эти крючки, а затем вы можете подключить плагин, как если бы они были обычными модулями, а проверка и т. Д. Будет выполнена автоматически.

+0

Спасибо @Bakuriu, это было именно то, что мне нужно. – nerdoc

2

Я знаю, что это старый пост, но мы разработали новое решение. Мы столкнулись с одной и той же задачей - распространять исходный код python, но не позволяя хакерам манипулировать кодом. Мы разработали решение создать пользовательский загрузчик для нашего приложения, используя signet http://jamercee.github.io/signet/.

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

Signet является мультиплатформенным и работает на windows, unix, linux, freebsd и т. Д. Если вы развертываете в windows, процесс построения загрузчика может даже применить сертификат вашего корпоративного кода для 100% -ной проверки вашего кода. Он также выполняет проверку PE.

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

+0

Hm. SHA1 - это криптографическая контрольная сумма, без подписи. Любой может построить такую ​​же контрольную сумму и поместить ее в программное обеспечение, верно? Вы должны отправить контрольную сумму с вашим «плагином» - но что делает злоумышленник, чтобы не допустить изменения кода плагина и перестроить контрольную сумму? Контрольная сумма только предотвращает случайное изменение кода (например, при ошибке загрузки), но не подделка. Для чего потребуется такой асимметричный ключ, как GPG. Программное обеспечение знает об открытом ключе, а плагин подписывается с использованием частного. Это не может быть изменено злоумышленником. Пакеты Linux (rpm/deb) подписываются таким образом. – nerdoc

+0

Подписание кода предотвращает подделку загрузчика (на окнах), который входит в состав Signet (http://jamercee.github.io/signet/signet.command.sign_code.html).Загрузчик вызывает функцию WinVerifyTrust, чтобы подтвердить, что бинарная подпись загрузчика соответствует сигнатуре подписчиков перед вызовом скрипта. На Linux еще нет универсальных решений (но мы все еще смотрим). – user590028

+0

Возможно, стоит проверить и эту ссылку http://jamercee.github.io/signet/index.html#code-signing – user590028

Смежные вопросы