Безопасное хранение секретов

image Расскажу об одном из портативных, кроссплатформенных методов хранения секретов на накопителях, в основе которого лежит только открытое, свободно распространяемое ПО.


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


Сформулируем задачу.
Существует папка с секретами (личные дневники, информация об аккаунтах, статьи на хабр и т.д.), которую ну никак нельзя хранить в открытом виде. Возможность прочитать данные из нее хочется иметь на любом компьютере, на который занесет. Для простоты описания дальнейших манипуляций сузим до всех компьютеров под управлением Windows. Но никто не мешает расширить этот круг, так как все используемое ПО кроссплатформенное.

Нам понадобятся следующие инструменты:
  • консольный архиватор
  • пакет программ, реализующих инструменты криптографии
  • шреддер файлов

Я буду использовать 7-Zip portable, GnuPG и Eraser portable.
На *nix системах это может быть к примеру tar, GnuPG и wipe

Создаем на флешке рабочую директорию (к примеру F:\bin\secure). Копируем в нее нужные нам инструменты:
  • 7z.exe, 7z.dll — из 7-Zip portable
  • Eraserl.exe, Eraser.dll — из Eraser portable
  • gpg.exe из GnuPG

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

F:\bin\secure\gpg.exe --gen-key --home=C:\

Ответив на все вопросы (если не понимаете что спрашивают в первых трех вопросах, можете ответить так: 1, 1024, 0) получим открытый и закрытый ключи, а также базу доверенных сертификатов. Это файлы:
  • C:\pubring.gpg
  • C:\secring.gpg
  • C:\random_seed
  • C:\trustdb.gpg

Самыми важными являются pubring (открытый ключ, с помощью которого можно зашифровать) и secring (закрытый ключ, с помощью которого можно расшифровать). Кроме того, советую запомнить имя владельца ключа и пароль. Записываем все на зарегистрированный носитель и кладем в сейф. Мне портативность важнее безопасности, поэтому оба файла я буду хранить на той же флешке. Просто положу их в такое место, где их врятли будут искать. Даже если и найдут, для расшифрования закрытым ключем понадобится пароль.

Пусть закрытый ключ будет F:\ЗАКРЫТЫЙ.КЛЮЧ, а открытый — F:\ОТКРЫТЫЙ.КЛЮЧ. Базу доверенных сертификатов (нужна, чтобы gpg не ругался при осуществлении операций шифрования/расшифрования) — файлы random_seed и trust_db кладем к gpg.exe, то есть в F:\bin\secure.

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

Осталось только реализовать скрипт шифрования, реализующий следующие операции:
  • Копипрование нужных ключей в F:\bin\secure
  • Архивирование каталога с сектерами
  • Шифрование архива
  • Полное удаление каталога, архива и ключей в F:\bin\secure

И скрипт расшифрования —
  • Копирование ключей
  • Расшифрование
  • Распаковка
  • Полное удаление архива и ключей
  • Удаление зашифрованного архива

Вот эти скрипты на batch:

enc.bat
 1 @echo off
 2 rem Получение ключей
 3 copy %3 "%~dp0/pubring.gpg" /Y >> nul
 4 rem Упаковка
 5 %~dp0/7z.exe a %1.7z %1 >> nul && start/wait %~dp0/gpg.exe ^
 6   --homedir=%~dp0 -r %2 --quiet -o%1.enc -e %1.7z
 7 IF NOT %ERRORLEVEL% == 0 goto fail
 8 echo ENCRYPTED SUCCESSFULL
 9 %~dp0/eraserl.exe -file %1.7z -silent && %~dp0/eraserl.exe -folder %1 ^
10   -subfolders -silent >> nul
11 goto end
12 :fail
13 echo ENCRIPTION FAILED
14 :end
15 rem Зачищаем ключи
16 %~dp0/eraserl.exe -file "%~dp0/pubring.gpg" -silent


dec.bat
 1 @echo off
 2 rem Получение ключей
 3 copy %3 "%~dp0/pubring.gpg" /Y >> nul
 4 copy %4 "%~dp0/secring.gpg" /Y >> nul
 5 rem Расшифровка
 6 start/wait %~dp0/gpg.exe --homedir=%~dp0 -r %2 --quiet -o%1.7z -d %1
 7 IF NOT %ERRORLEVEL% == 0 goto fail
 8 rem Распаковка
 9 %~dp0/7z.exe x %1.7z -o%~dp1 >> nul && del %1 /Q && %~dp0/eraserl.exe ^
10   -file %1.7z -resultsonerror
11 echo DECRYPTED SUCCESSFULL
12 goto end
13 :fail
14 echo DECRYPTION FAILED
15 :end
16 %~dp0/eraserl.exe -file "%~dp0/secring.gpg" -resultsonerror && ^
17 %~dp0/eraserl.exe -file "%~dp0/pubring.gpg" -resultsonerror


Располагаем их в той же папке F:\bin\secure. Если запаковать Eraserl.exe, Eraser.dll и gpg.exe с помощью upx, то вся папка secure вместе с ключами легко помещается на зарегистрированной 3,5" дискете.
Сам процесс зашифрования выглядит так:

F:\bin\secure\enc.bat F:\ВАЖНАЯ_ПАПКА ИМЯ_ВЛАДЕЛЬЦА_КЛЮЧА F:\ОТКРЫТЫЙ.КЛЮЧ

а расшифрования так:

F:\bin\secure\dec.bat F:\ВАЖНАЯ_ПАПКА.enc ИМЯ_ВЛАДЕЛЬЦА_КЛЮЧА F:\ОТКРЫТЫЙ.КЛЮЧ F:\ЗАКРЫТЫЙ.КЛЮЧ

В процессе расшифровки вас попросят ввести пароль на закрытый ключ.

Замечание:
Данные скрипты шифруют только папки, потому что eraserl различает папки и файлы, но при наличии необходимой сноровки это досадное недоразумение легко поправимо.
+14
29 октября 2009, 22:29
41
hoxnox 19,0

комментарии (51)

+13
Evgeny_Shiryaev #
А я использую связку KeePass+TrueCrypt. Очень удобно.
+1
Maklaut #
Аналогично!

mount.bat
@.\TrueCrypt\TrueCrypt.exe /q /w /ls data

umount.bat
@.\TrueCrypt\TrueCrypt.exe /q /f /ds

или

mount.sh
#!/bin/sh

OPTIONS=""

truecrypt $OPTIONS --mount --keyfiles="" --protect-hidden=no --fs-options="dmask=077,fmask=177,nosuid,errors=remount-ro" \
data /media/sec-flash

0
xintrea #
А umount.sh?
0
Maklaut #
А просто umount /media/sec-flash без всяких хитростей, я его даже в отдельный скрипт не стал оформлять.
+2
maki #
Я пользую KeePass. Думал, что это вполне самодостаточное решение. Можете в двух словах рассказать, зачем нужен TrueCrypt?
0
ice9 #
TrueCrypt зашифровывает часть диска или диск. Например, для того, чтобы положить на эту зашифрованную часть тот же KeePass :)
0
maki #
так а KeePass разве не шифрует свою базу? Если у меня её утянут — каковы шансы, что откроют (ну если не перебором, конечно)?
0
ice9 #
Не могу ничего вам рассказать о базе KeePass'а, понятно, что пароли там хранятся не в явном виде. В любом случае, TC — лишний барьер на пути к базе.
Хочу подчеркнуть, что база KeePass — это только пример того, что может быть на зашифрованном диске. Если вся ваша приватная информация ограничивается KeePass'ом, вам, возможно, и не требуется дополнительное шифрование.
+1
odionysus #
он шифрует базу blowfish
0
GooRoo #
Он шифрует базу AES и Twofish.
0
kozyabozya #
я пользуюсь просто KeePass. версии 1.13, он многоплатформенный (пользую Windows XP + WM)

версия 2.0 поддерживает синхронизацию, но несовместима с PDA
0
krak #
Почему? Есть и версия поддерживающая 2.x
http://keepasssd.sourceforge.net/
0
kozyabozya #
спасибо, на момент когда я начал пользоваться, ее еще не было
+2
abacaba #
Тема кроссплатформенности не раскрыта:)
0
Andrey_Rogovsky #
0
abacaba #
не понял, Luks может расшифровать то, что было зашифровано автором на Windows?
0
hoxnox #
Зашифровано может быть под одной операционной системой, а расшифровано под другой.
0
abacaba #
Это я понимаю. Алгоритмы шифрования и архивирования не зависят от платформы. Но примеры в статье — только для Windows. Тот же Eraser на сайте по ссылке скомпилирован под Windows (есть там еще и проект Visual Studio с исходниками, но согласитесь, тема кроссплатформенности не раскрыта).
0
hoxnox #
Я лишь упомянул о tar+wipe под *nix. Согласен, можно было изложить подробнее.
0
Killy #
Linux compatibility (Cryptoloop «losetup», dm-crypt and LUKS supported)
FreeOTFE
(Прога выглядит едва ли не страшнее, чем 7zip, однако достаточно удачная по функционалу.)

Ну и, раз уж решил написать, заодно упомяну SDelete от Марка Руссиновича в качестве стиралки, хотя она то уж ни разу не кроссплатформенная. Но по ссылке любопытно прочитать про принцип работы и сложности.
0
hoxnox #
>sdelete
Тоже сначала ей пользовался. Не было проблем с различием файлов и папок. Но, мне кажется, eraser получше затирает.
+6
moooV #
Использую tar и openssl, потому что:

1) Кошерно
2) Unix-way
3) Можно использовать ЛЮБОЙ метод шифрования существующих популярных.

Все просто:

Запаковка (AES256-CBC, мего параноики могут использовать serpent):
tar cj папка | openssl enc -e -aes-256-cbc -k пароль > готовый_архив.tbe

Распаковка:
cat шифрованный_архив.tbe | openssl enc -d -aes-256-cbc -k пароль | tar xvj -C куда_распаковать
0
ZAZmaster #
Плюс вам!
0
hoxnox #
> Кошерно

Действительно, Шамир бы похвалил. =) Спасибо.
0
CTpaHHoe #
отличное решение.
–1
d3z #
На что только люди не идут, лишь бы Password Safe не ставить.
0
hoxnox #
«Секреты» — это не только пароли! Любые файлы, доступ к которым должен быть ограничен.
0
t0ster #
В вашем методе есть небольшой косяк — после того как вы все распаковали, использовали и очистили, есть шанс, что кто-нибудь просто восстановит удаленные файлы.
0
zerkms #
как «просто» восстановить удалённые с помощью eraserl файлы?
0
hoxnox #
Используйте более надежные методы зачистки данных, если вас не устраивает Eraser
+2
vo0d #
а truecrypt или какой-нить pgp-диск юзать не проще?
кстати, бэкапы флешки делаете?
–2
Melonamin #
1Password anywhere — www.switchersblog.com/2009/09/1password-3-feature-spotlight-1passwordanywhere.html
Конечно ни разу не бесплатно, но зато функционально и очень удобно. По личному опыту — программа стоит своих денег.
0
catbegemot #
lastpass.com — бесплатно
0
AzeriFire #
В процессе расшифровки вас попросят ввести пароль на закрытый ключ.


А что если вы забудете пароль дешифровки?! Если вы такой забывчивый, то вполне возможно такое.
0
hoxnox #
ПМожно заставить себя запомнить 1, но не 100-150
+1
AzeriFire #
Я в Гмейле создал ярлык ( Пассворд) и сохраняяю пассы в Гмейле. Что бы быстро найти открываю ярлык Пассворд.
0
almarz #
Но Вы же запоминаете пароль Gmail.
P.S. Держать в почте картотеку паролей не лучшая идея.
+1
MaxUp #
Использую SplashID уже 4 года :) сотни 2 паролей под надежной защитой. Есть версии практически для всех девайсов. Платный, но своих денег стоит :)
+1
cod #
Использую KeePass. Очень удобно. Есть под все платформы.
0
ruzzz #
Вместо флешки можно использовать сервис подобный www.getdropbox.com
0
n1ght #
Ну не везде есть доступ в интернет.
0
Mezomish #
Я понимаю, что это только пример, но выглядит довольно забавно:

Просто положу их в такое место, где их врятли будут искать.

Пусть закрытый ключ будет F:\ЗАКРЫТЫЙ.КЛЮЧ, а открытый — F:\ОТКРЫТЫЙ.КЛЮЧ.


:)
–1
hoxnox #
Это называется ирония.
0
parovozik #
а я… а я… использую ручку и блокнот =)
–1
FB3 #
Пароли храню в голове, их конечно не несколько сотен, но штук 5 разных точно есть, плюс логины на сайтах различаются.
Где не помню пароль — жму кнопку напоминания и получаю на почту.
Флэшку с собой не таскаю…
+1
hoxnox #
Большинство видит только хранение паролей. Зря я, наверное, этот пример вставил. =(
Вообще, если честно, изначально использовал этот метод для
1. Сокрытия некоторой информации на жестком от лиц, имеющих к нему доступ (или способных его получить административным воздействием). Шифровал и кидал файл в system32 с каким-нибудь не выдающимся именем…
2. Создания долго хранящихся архивов, чтобы инструменты для его восстановления лежали на дискете в надежном месте.
0
zxm #
А чем не устраивает TrueCrypt? Бесплатный, кроссплатформенный, удобный.
0
hoxnox #
Во-первых не знал о его существовании, а во-вторых настораживает, что для зашифрования/расшифрования ему требуется лишь пароль. А защита Кирхгофа предполагает стойкость пропорциональной стойкости ключа.
0
hoxnox #
Еще вспомнил, что прежде чем зашифровывать в TrueCrypt нужно заранее выделить определенное дисковое пространство.
Вобщем, TrueCrypt штука хорошая, но я продолжу пользоваться своим велосипедом. Он роднее =)
0
hoxnox #
  1.  
  2. #!/bin/sh
  3. # Ubuntu - dec script for /usr/bin
  4. # usage: dec <arch> <user> <secring> <pubring>
  5. # Для использоавния нужны пакеты: p7zip-full, wipe, gnupg
  6. # Автор hoxnox@gmail.com
  7.  
  8. # Получение ключей
  9. called_path=${0%/*}
  10. cp $3 /tmp/pubring.gpg
  11. cp $4 /tmp/secring.gpg
  12. # Расшифровка
  13. result=`gpg --homedir=/tmp -r $2 --quiet -o$1.7z -d $1`
  14. if $result; then
  15.   # Распаковка
  16.   worked_path=`readlink -f $1`
  17.   7z x $1.7z -o${worked_path%/*} 1>/dev/null && rm -r $1 && wipe -rfs $1.7z
  18.   echo "DECRYPTED SUCCESSFULL"
  19. else
  20.   echo "DECRYPTION FAILED"
  21. fi
  22. # Затираем ключи
  23. wipe -sf /tmp/pubring.gpg
  24. wipe -sf /tmp/secring.gpg
  25.  


0
hoxnox #
  1.  
  2. #!/bin/sh
  3. # Ubuntu encryption script for /usr/bin
  4. # usage: enc <folder> <user> <pubring>
  5. # Автор hoxnox@gmail.com
  6. # Зависимости: gnupg, p7zip, wipe
  7.  
  8. # Получение ключей
  9. called_path=${0%/*}
  10. cp $3 /tmp/pubring.gpg
  11. # Упаковка и шифрование
  12. 7z a $1.7z $1 1>/dev/null
  13. result=`gpg --homedir=/tmp -r $2 -quiet -o$1.xnx -e $1.7z`
  14. if $result; then
  15.   echo "ENCRYPTED SUCCESSFULL"
  16.   wipe -frs $1.7z && wipe -rfs $1
  17. else
  18.   echo "ENCRYPTED FAILED"
  19. fi
  20. # Затираем ключи
  21. wipe -fs /tmp/pubring.gpg
  22. wipe -fs /tmp/secring.gpg
  23.  

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