Как стать автором
Обновить

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

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

Окружение


Изначально предполагается наличие шифрующего софта на компьютере. Естественный выбор использовать openssl. В линуксе он есть по умолчанию. В windows он идет в комплекте с mingw в инсталяции git для windows. Единственное о чем нам надо позаботиться под Windows, чтоб папка в которой openssl находится (например «C:\Program Files\Git\mingw64\bin\») оказалась в переменной среды 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 Files\Git\bin\git.exe" %ARGS: show = show --textconv %


Вариант для линукса (к сожалению не проверялось):

#!/bin/bash
export ARGS="$*"
git "${ARGS/ show / show --textconv }"


Теперь, надеюсь, тема раскрыта.
Теги:
Хабы:
+19
Комментарии46

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн