Нюансы шифрования в Git

в 10:25, , рубрики: Git, github

Если вы захотели воспользоваться публичным ресурсом вроде GitHub или GoogleDrive для хранения своего репозитория, но при этом не готовы делиться со всем миром результатами своего труда, то вам поможет шифрование файлов в гит-репозитории. Это не сверхсекретная технология и на эту тему есть некоторое количество небольших статей в интернете (и даже на Хабре), но все они являются вариацией куска документации git посвященного атрибутам и тему совершенно не раскрывают. Кроме этого, в процессе использования git в этом режиме появляются ньюансы использования, которые не всегда легко понять и решить и которые я в этой статье постараюсь осветить.

Окружение

Изначально предполагается наличие шифрующего софта на компьютере. Естественный выбор использовать openssl. В линуксе он есть по умолчанию. В windows он идет в комплекте с mingw в инсталяции git для windows. Единственное о чем нам надо позаботиться под Windows, чтоб папка в которой openssl находится (например «C:Program FilesGitmingw64bin») оказалась в переменной среды PATH. Тогда нам не придется создавать дополнительные утилиты (как это рекомендуется в статьях про шифрование в гите) и вся конфигурация намного проще.

Настройка git

Теперь займемся магией создания аттрибутов в git. Для начала мы должны разобраться с тем, что именно мы хотит шифровать в дереве. Если вы матерый параноик, вроде меня, то вы решите шифровать всё. Создадим файл в корне пустого репозитория .gitattributes:

* filter=openssl diff=openssl
.git* !filter !diff
init.txt !filter !diff

Если вы не настолько параноидальны, можете заменить вилдкард на *.java или *.cpp по вкусу.
Зачем init.txt? Сделаем небольшую памятку для себя, чтобы в случае клонирования репозитория не приходилось судорожно искать инструкцию в интернете. Кроме того, её можно весьма успешно использовать как шеловский скрипт для инициализации криптования в свежесклонированной копии.

Теперь создадим упомянутый файл init.txt:

<code>#This is protected repository. To initialize it you need:
#
# git clone -n https://github.com/<your_project_name>
# git checkout tags/init
# Then execute in shell:
# . init.txt <password for repository>
[ -z "$1" ] && echo "Argument required: <password>" && return
git config filter.openssl.clean "openssl enc -base64 -aes-256-ecb -S 123456789 -k $1"
git config filter.openssl.smudge "openssl enc -d -base64 -aes-256-ecb -k $1"
git config diff.openssl.textconv "openssl enc -d -base64 -aes-256-ecb -k $1 2&>/dev/null || cat"
git checkout master</code>

Убедившись в том, что git и openssl доступны в путях мы запускаем файл как и показано в комментарии (Если вы находитесь в Windows это надо запускать из git-bash).

. init.txt my_repo_pass

Или же просто руками запускаем 3 команды git config из этого файла заменив $1 в строке на пароль для репозитория.

Теперь добавим это всё в репозитарий:

git add .
git commit -m "protection initialization"
git push
git tag init
git push --tags

Вуаля, у нас всё готово к работе. Теперь мы можем добавлять новые файлы и они будут автоматически криптоваться.

Интеграция с Intelij

Теперь самое интересное. Если вы создадите закриптованный java проект на github и начнете с ним работать вы очень скоро заметите, что гитовый плагин в IDE упорно не хочет сравнивать файлы с предыдущими версиями. Это происходит из-за того, что intelij подтягивает предыдущие версии файла из репозитория с помощью команды git show. А теперь внимание: команды git show и git format-patch не используют фильтры по-умолчанию. Для этого необходимо им указывать опцию --textconv. Заставить это делать сам гитовский плагин я не смог, поэтому я сделал маленький враппер для git и указал его в настройках. Он автоматически добавляет эту опцию для команду show.

git4idea.bat

@echo off
set ARGS=%*
"C:Program FilesGitbingit.exe" %ARGS: show = show --textconv %

Теперь, надеюсь, тема раскрыта.

Автор: Osykov

Источник

Поделиться