PGP / GPG подписанный код Python

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

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

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

2 ответов


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

в частности, вы, вероятно, найдете удобным установить мета-путь крюка, который ищет "подписанные модули" и возвращает Loader который способен выполнять импорт из этого подписанного формата.

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

  1. код плагина в виде модулей/пакетов
  2. подпись PGP вышеуказанного кода

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

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

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

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


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

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

Signet является мультиплатформенным и работает на windows, unix, linux, freebsd и т. д... При развертывании в windows процесс построения загрузчика может даже применить сертификат кода компании для 100% проверки кода. Это также делает проверку ЧП.

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