Шифрование дискет


Похоже что для шифрования дискет LUKS не подходит, т.к. его заголовок больше доступного дискового пространства 1.44 МБ. cryptsetup luksFormat работает без предупреждений, но luksOpen выдаёт сообщение о нехватке места. Можно ли уменьшить размер заголовка? Среди штатных опций такой возможности не обнаружил.

Если LUKS не подходит, какие другие варианты лучше соответствуют – EncFS, ecryptfs, loop-aes? В идеале безсигнатурное шифрование, хотя сомневаюсь что существует удобное решение, поэтому такое условие не обязательно.

Комментарии
— SATtva (05/04/2015 20:03)   
LUKS принципиально не подходит не только из-за ёмкости, но и из-за ненадёжности носителя: малейшее повреждение ключевых слотов заголовка — и контейнер уже не открыть. Можно использовать cryptsetup без LUKS-расширений. Только очень внимательно читайте документацию, чтоб не прострелить себе ногу.

А что, где-то в дикой природе кроме армии дискеты ещё встречаются? Я рабочий дисковод видел последний раз, наверное, лет 15 назад.
Гость (05/04/2015 20:33)   
Можно использовать cryptsetup без LUKS-расширений

Тогда нужно брать откуда-то 256-битный ключ, не запоминать же его. Можно в качестве ключа пароль подавать, но его битность заведомо ниже, т.к. KDF в таком варианте не используется.

где-то в дикой природе кроме армии дискеты ещё встречаются?

Дискеты это дешёвый способ хранения небольших объёмов информации. В этом случае дискеты имеют преимущества

1. Дешевизна – для хранения нескольких десятков килобайт лучше купить дискету за 20-30 рублей, чем гигабайтную флешку за 1 т.р.

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

По данным Википедии[link1] дискеты активно используются в администрации президента и правительстве США.

Я рабочий дисковод видел последний раз, наверное, лет 15 назад.

Дисководы до сих продаются, стоят в районе 200 рублей (если по USB, то в несколько раз дороже).
— unknown (05/04/2015 20:44, исправлен 05/04/2015 20:45)   

[юмор]
Используйте отделяемый заголовок и носите его на флэшке.
[/юмор]


Используйте бессигнатурный cryptsetup без LUKS:

Гость (05/04/2015 20:59)   
Используйте бессигнатурный cryptsetup без LUKS

Всего около 64 алфавитно-цифровых символов, что соответствует 6 бит/символ в пароле. Т.е. 256 битному ключу соответствует без PBKFD 43-символьный пароль – последовательность случайных символов. Проблема cryptsetup без LUKS именно в этом – нет KDF хотя бы для частичной компенсации малой (по сравнению с ключом) битности пароля. А миллион итераций это 20 дополнительных бит.
Гость (05/04/2015 21:28)   
Была бы какая-нибудь стандартная утилита расширения ключа, используемая в канале перед cryptsetup, то бессигнатурный вариант был бы идеален.
— SATtva (05/04/2015 21:33)   

Заверните в простой скрипт: https://www.dlitz.net/software/python-pbkdf2/
Гость (05/04/2015 21:40)   
Скрипты видел на Perl и на Python, но на C производительность наверное заметно выше будет, что в данном случае существенно.
— SATtva (05/04/2015 21:54)   
Не вижу причин, почему скрипт нельзя преобразовать в C-код тем же Cython'ом.
— unknown (05/04/2015 22:59, исправлен 05/04/2015 22:59)   

Она исторически примерно для этого и была и пока ещё есть. Называется hashalot[link3]. Но PBKDF не умеет, разве что пропатчить.

Гость (06/04/2015 01:25)   
Гигабайтную флешку за 1000р.. С Вами все в порядке?
300р флешка стоит. 8гб – 500р.
Гость (06/04/2015 01:29)   
Шифрование дискет

TrueCrypt для этого может подойти, если сделать файл-контейнер на дискете объемом 1400КБ.
Гость (06/04/2015 01:39)   
Не проще использовать SD карту? Ее уничтожить не сложнее наверно просто физически.
И где вообще продают дискеты сейчас?
Можно еще форматировать на 2.88 :DDD Или найти LS-120 или ZIP на каком-нибудь заброшенном складе :DDDDD
Гость (06/04/2015 01:51)   
Шифрование дискет

Извиняюсь, забыл вопрос поставить, хотел спросить: – TrueCrypt для этого может подойти, если сделать файл-контейнер на дискете объемом 1400КБ?
Гость (06/04/2015 11:01)   

TrueCrypt – программа
дискета объемом 1400КБ – носитель.
Гость (06/04/2015 11:04)   

Могу выслать наложенным платежом )
Гость (06/04/2015 11:32)   
Называется hashalot

Когда cryptsetup был shell-скриптом, а не C-программой, уже тогда напрямую вызывать hashalot не требовалось, т.к. они с dmsetup автоматически вызывались из скрипта. Современные версии cryptsetup тоже умеют читать пароль с терминала и хешировать.

Возник лишь вопрос – если по умолчанию используется ripemd160 или sha1, как 160-битный хеш дополняется до 256-битного ключа.

Представляется что cryptsetup стал слишком сложным, как минимум с недостатками

1. Невозможность использования заголовка для носителей малой ёмкости. При том что одного 512-байтного сектора более чем достаточно для всей его информации.

2. Отсутствие алгоритма расширения ключа при бессигнатурном шифровании. Кроме PBKDF2 не предусмострено более продвинутых алгоритмов как scrypt, не уязвимых к распараллеливанию.

3. Ключ хранится в хрупком виде, размазанный по мегабайтному заголовку, что увеличивает уязвимость к дефектам диска, повышая вероятность утери ключа. Мастер-ключ вообще дублируется в заголовке?

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

300р флешка стоит. 8гб – 500р.

Давно не видел в продаже флешек на 1 ГБ. В основном продаются 16 ГБ за 1-1.5 т.р. Даже если бы были, всё равно стоили бы в десять раз дороже дискет и без гарантии затирания данных.
— unknown (06/04/2015 12:00, исправлен 06/04/2015 12:01)   

Историческая справка: hashalot остался с тех времён, когда для дискового шифрования ещё не было создано cryptsetup/dmcrypt, а был только losetup с непродвинутой реализацией криптографии.



  1. Оно делалось под LVM/RAID и прочее. Возможность шифровать простые устройства оставлена. В особо тяжёлых случаях можно использовать без LUKS.
  2. Бессигнатурку авторы не хотят. Scrypt и прочие замены PBKDF2 планируются, но не в приоритете и можно прождать n лет.
  3. Anti-forensic stripe. Это не бага, это фича.


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

Гость (06/04/2015 21:18)   
Anti-forensic stripe. Это не бага, это фича.

Могли бы оставить возможность отключить её когда не нужна.
— SATtva (06/04/2015 22:33)   
Опции тоже не нужны. "There is only one mode and it secure". ©
— unknown (06/04/2015 22:52)   

По идее — да. Если бы там зафиксировали на данный момент, как самый оптимальный из безопасных вариантов -c aes-xts-plain64 -s 512 -h sha512. Но даже то, что там стоит дефолтное и не самое актуальное — вполне секьюрно.
Гость (07/04/2015 02:26)   

Запоминать[link4], запоминать[link5]. Заодно отпадает необходимость использовать KDF.


Выше уже написали, но всё-таки добавлю: почитайте man cryptsetup на предмет того, как там организована plain mode, и обратите внимание на опцию -h. Если -h указано, то ключ будет хэшем пароля.


Я бы не был столь категоричен, но с основной мыслью согласен: дискета дешёвая и уничтожается легко (например, выбрасыванием в печь). Я не знаю, как с надёжностью записи на дискеты. По-моему, слишком не очень, даже если дискета чистая или писали на неё мало. Сколько было проблем, когда дискета не читается вообще или на каком-то конкретном дисководе — не счесть.


Unknown, как всегда, палится на мелочах. «--create /dev/mapper[шифрустройство]» работать не будет. Во-первых, create — команда, а не опция, поэтому пишется без двойного минуса. Во-вторых, аргументом create выступает имя нового устройства, а не имя вместе с полным путём к нему, поэтому я сомневаюсь, что полный путь будет принят и правильно понят. В конце комментария[link6] есть правильные команды.


Всё-таки 39[link7], а не 43.


Если пароль сам по себе достаточно стойкий, то хэширования достаточно. В plain mode cryptsetup'а оно есть.


Абсолютно несущественно. KDF запускается лишь один раз перед открытием контейнера, чтобы получить мастер-ключ из пароля. Отработает этот KDF за секунду или за доли секунды — разницы нет. Вот если бы вы брутер писали к контейнеру с забытым паролем, было бы другое дело.


Как быстро уничтожить пластмасску с влитой в неё электроникой? Вспомнилось[link8]:

Можно консервативно считать, что MicroSD-карта разжевывается за одну минуту (попробуйте надосуге), но SD-карту вы уже не разжуёте.


В организациях, где технику не списывают и вовремя весь парк компьютеров не обновляют, дисководы будут существовать ещё 15 лет.


+1


Эти вопросы тут обсуждались[link9] ранее, готового ответа у меня нет. Возможно, если режим требует строго 256 бит ключа, а в качестве хэша указан тот, который даёт меньше, cryptsetup будет выдавать ошибку (но это всё надо проверять). В мануале есть тумманный намёк

If "plain" is used as argument to --hash, the input data will not be hashed. Instead, it will be zero padded (if shorter than the key size) or truncated (if longer than the key size) and used directly as the binary key. This is useful for directly specifying a binary key. No warning will be given if the amount of data read from stdin is less than the key size.

но он касается случая, когда хэширование не используется вообще. Может быть, и при хэшировании недостаток просто заполняется нулями. У меня у самого был вопрос[link10] на подобную тему, который так и остался неотвеченным:

Когда мы подаем файл с параметром -d в режиме plain, его первые S бит (S — длина ключа, заданная нами с помощью -s) используются в качестве ключа без каких-либо преобразований, поэтому указание хэш-функции просто игнорируется. (Поэтому требования к качеству ключевого файла для plain mode очень высоки; если хочется использовать большой файл с низкой энтропией, нужно использовать stdin.)

Правильное замечание. Мои примеры изначально были с stdin, и там хэширование может быть использовано (как и для ввода с терминала). Вообще, если вспомнить про применение бессигнатурного шифрования (plain mode), нужно отметить, что хэширования вы не избежите хотя бы по той простой причине, что вы не можете (быстро и легко без промежуточных шагов) ввести в качестве пароля бинарный мастер-ключ — попросту не все символы в случайном мастер-ключе печатные. Тут будет естественный выход — помнить достаточное (по энтропии) количество печатных символов, которые потом будут сконвертированы в хэш и отданы на вход в LUKS. Надеюсь, когда в man cryptsetup пишут про хэширование, имеется в виду, что хэш может быть бинарным (а не только base64, каким мы его всегда видим), иначе было бы совсем плохо.

Я так и не понял, как printable-хэши превращаются в бинарные ключи. Для хэшей предусмотрена перекодировка в бинарный вывод с алфавитом длиной 256 символов? Не все из них печатные ASCII-символы.


Заголовок можно руками сделать. В plain mode указываете первые сколько-то байт блочного устройства как отображаемые шифрованием в нечто иное. Вроде это должно делаться добавлением одной-единственной опции: отобразить расшифрованием только первые 512 байт — это -b 1, судя по man cryptsetup. Далее отображённое расшифрованное устройство можно использовать как ключ для расшифрования остальной его части. Мне лень тщательно это обдумывать и перепроверять, поэтому могут быть ошибки. Команды примерно такие:
# cryptsetup -c aes-xts-plain64 -s 512 -h sha512 \
  -b 1 create MY_HEADER /dev/fd[устройство]
# cryptsetup -c aes-xts-plain64 -s 512 -h sha512 \
  -o 1 -d /dev/mapper/MY_HEADER create MY_DEVICE /dev/fd[устройство]
Возможно, надо сделать ещё тоньше и учесть опцию -p, выделив под IV отдельный сектор (например, второй), таким образом отведя под заголовок первые два сектора, а основное устройство использовать начиная с третьего сектора. Мне необходимость игр с -p плохо понятна.


Как зачем? Чтобы менять пассфразы[link11] на криптотом без его перешифровки, а также безопасно и быстро удалять с него информацию, затирая шифрованный мастер-ключ (luksKillSlot).


У меня есть подозрение, что это легко делается простейшим скриптом, используя некоторые опции cryptsetup (наподобие того, как я написал это выше). Это не будет в полной мере отрицаемым шифрованием в том смысле, в каком оно могло бы быть, но, тем не менее. Если вас интересуют эти вопросы, читайте разбор полётов[link12] с предложением в конце, которое было признано[link13] даже unknown'ом.
Гость (08/04/2015 22:05)   
Запоминать, запоминать. Заодно отпадает необходимость использовать KDF.

Ради дополнительных нескольких символов пароля усложнять действительно не стоит. Но KDF всё-равно была бы полезной.

Я не знаю, как с надёжностью записи на дискеты.

Приемлемо, зависит ещё от качества и производителя дискеты. Хранить данные на дискетах нужно хотя бы в двух экземплярах.

Возможно, если режим требует строго 256 бит ключа, а в качестве хэша указан тот, который даёт меньше, cryptsetup будет выдавать ошибку

Ошибку не выдаёт, а дополняет хеш чем-то до нужной длины, и это не нули. Например, в случае sha1 первые 20 символов ключа совпадают с выводом sha1sum пароля, но происхождение оставшихся 12 симоволов неясно.

как printable-хэши превращаются в бинарные ключи

Насколько понял, хеш при выводе раскаповывает двоичную строку в hex-код, cryptsetup заполняет им соответствующее поле таблицы, составляемой для dmsetup, а последний обратно упаковывает в двоичный код при передаче модулю ядра.

Чтобы менять пассфразы на криптотом без его перешифровки

Для этого достаточно одного слота.
Гость (09/04/2015 02:04)   

В припципе, да, такое поведение было бы логичным. Благодаря вашему пояснению до меня только сейчас дошло, почему вывод хэша именно в шестнадцатеричном формате идёт — это же по сути и есть побайтовый вывод вида «два символа на байт». В связи с тем, что новые хэши очень длинные, было бы удобно конвертировать этот вывод в алфавит из печатных ASCII-символов, чтобы он стал покороче, и сравнивать было проще.


Да, но это смотря как менять. В том случае, который описан по ссылке, нужно минимум 2 слота: тот, который хранит старый пароль и тот, который хранит новый. Когда новый надёжно запомнился, старый можно уничтожать.
— unknown (09/04/2015 09:29)   

Обычно вручную это никто не сравнивает:
Гость (09/04/2015 12:14)   

Если у меня на диске откуда-то взялись (возможно) одинаковые файлы, которые я хочу проверить на предмет идентичности, как это правильно делать? Можно вручную не сравнивать, но это опять грозит скриптомесевом же.
Гость (09/04/2015 12:16)   
Впрочем, возможно, вот этого достаточно:
$ sha512sum file1 file2 > file.sha512
$ sha512sum -c file.sha512
— SATtva (09/04/2015 12:22)   
sha1sum test1 | echo `cut -d' ' -f1`"  test2" | sha1sum -c
Гость (09/04/2015 12:38)   

Дискета-то точно с гарантией.. даже тогда когда это не нужно.
Гость (09/04/2015 12:46)   

Не работает:
$ sha1sum test1 | echo `cut -d' ' -f1`"  test2" | sha1sum -c
cut: -: Input/output error
sha1sum: standard input: no properly formatted SHA1 checksum lines found
Можно как-то так:
$ (sha1sum test1 && sha1sum test2) | sed 's/ .*$//' | uniq -c
      2 ce3af7760f1289d02bf6a7ad19f3214c4e5c7c2e
$ (sha1sum test1 && sha1sum test2) | sed 's/ .*$//' | uniq -c
      1 ce3af7760f1289d02bf6a7ad19f3214c4e5c7c2e
      1 d2e2cbd035bb5d677ce8eec983ac04a168bfad3f
В первом случае файлы одинаковые, во втором — нет. Вместо uniq -c можно просто число строк считать через wc -l. Вместо sed можно писать cut -f 1 -d ' '.


Выше по треду автору именно это и хотели тактично сказать, но он ответил, что двух дискет (с одной копией т.е.) достаточно.
Гость (09/04/2015 12:52)   

Недостаточно. Оно было бы так, если б файл file.sha512 формировался откуда-то извне. А в этом случае ответ будет всегда ОК, и это тривиально.


Хотелось бы проверять как-то удобно типа
$ ./checkifthesame file1 file2
чтобы не набирать каждый раз это всё (визуально быстрее сверишь, чем наберёшь все эти команды). В общем, по-любому придётся скрипт писать. В случае коротких файлов проще пользоваться diff'ом, но вот для гигабайтных...
— SATtva (09/04/2015 12:53, исправлен 09/04/2015 12:53)   

Работает:

$ sha512sum file1 | echo `cut -d' ' -f1`"  file2" | sha512sum -c
file2: ЦЕЛ
 
$ sha512sum file1 | echo `cut -d' ' -f1`"  file3" | sha512sum -c
file3: ПОВРЕЖДЁН
sha512sum: ПРЕДУПРЕЖДЕНИЕ: НЕ совпала 1 вычисленная контрольная сумма
В каком виде у Вас вывод sha*sum?

Гость (09/04/2015 13:01)   


Честно говоря, я вообще не понимаю вашу команду. `cut -d' ' -f1` — что это такое? Откуда cut возьмёт аргумент, по-вашему? Из пайпа он не читает, имя файла тоже не указано. Я не понимаю, как это вообще может у вас работать. Всё, что в ` `, выполняется во внутреннем шелле.
— SATtva (09/04/2015 13:07)   

Простите, но сфигали?
$ echo '123 321' | cut -d' ' -f1
123
$ echo '123 321' | echo `cut -d' ' -f1`
123
Гость (09/04/2015 13:21)   

$ echo '123 321' | cut -d' ' -f1
123
$ echo '123 321' | echo `cut -d' ' -f1`
cut: -: Input/output error
SATtva, почистите свои диски от вирусняков. На нормальной незатрояненной системе это работать не должно. Ещё раз: всё, что в косых кавычках, выполняется во внутреннем шелле. Он, этот шелл, ничего про то, что вокруг (за исключением имён переменных) не знает.

UPD: Ответ найден. В bash и в sh работает, в zsh — нет. Но я так и не понял, почему это работает в bash/sh.
Гость (09/04/2015 13:28)   
Я не понимаю, почему echo `command` и command эквивалентны. Как это следует из документации? Например, «| `command`» в этом случае не работает, как и должно быть.
Гость (09/04/2015 13:37)   
Смысл команд понятен (почему они отрабатывают), но почему это следует из логики/документации шелла — неясно. Смысл сводится к этому (проще и наглядней, чем ваши извраты):
$ sha512sum file1 | sed 's/file1/file2/' | sha512sum -c
file2: FAILED
sha512sum: WARNING: 1 computed checksum did NOT match
$ sha512sum file1 | sed 's/file1/file2/' | sha512sum -c
file2: OK
— SATtva (09/04/2015 13:40)   
Кода, который полагается на такое поведение — горы. Я скорее не понимаю, почему zsh ведёт себя иначе.


Почитайте man bash, Command Substitution. Я не вижу, почему из этого должно следовать что-то другое.


Ох лол.
— unknown (09/04/2015 14:25, исправлен 09/04/2015 14:44)   

В соревнование башистов врывается команда Anonymous named pipe's[link14]:


diff <(cat file1 | sha512sum) <(cat file1.copy | sha512sum) 1>/dev/null ; echo $?
0


diff <(cat file1 | sha512sum) <(cat file2 | sha512sum) 1>/dev/null ; echo $?
1


Можно грабить писать альяс на аргументы $1 и $2 вместо имён файлов.

— SATtva (09/04/2015 14:37)   
И с разгромным счётом одерживает победу unknown.
— unknown (09/04/2015 15:21)   
Победителю — приз: дырка от 3-дюймовой дискеты. Вручается удалённо, посредством исполнения анонимного ритуала протокола.
— sentaus (09/04/2015 16:21)   
ЭЭЭ, а зачем хэши-то считать, если надо просто два файла сравнить на предмет совпадения/несовпадения? cmp чем-то не устраивает?
— SATtva (09/04/2015 16:22)   
Недостаточно криптогиково!
— unknown (09/04/2015 16:30, исправлен 09/04/2015 16:31)   

Дырка от дискеты переходит вам. Можно ещё дырок от перфокарт добавить.

Гость (10/04/2015 13:34)   

Zsh не полностью POSIX-compliant, вроде был такой факт. Т.е. он где-то сбросил с себя legacy и пошёл дальше, а остальные продолжают насиловать bug2bug-compatibility from 1970s.


В этой секции ни в man bash, ни в man sh, ни в man zsh поведение потоков (откуда они берут инпут и берут ли) вообще не оговаривается.


Ну так правда же. Вы берёте вывод sha512sum file1, заменяете в нём имя файла и скармливаете получившуюся строку на проверку команде sha512sum -c. Логично эту замену и записать той программой, которая делает замены — потоковым редактором (stream editor).


Круто, спасибо за ссылку, не знал про такие тонкости.


Вопрос был в том, что работает быстрее: побайтовое сравнение или хэшевое. Наверно, раз для вычисления хэша всё равно надо все байты прочитать, быстрее не будет, так что правда ваша: сравнивать хэши не нужно. Даже без cmp выше была приведена команда diff, с её помощью можно и бинари сравнивать, работает быстро:
$ diff /usr/bin/tor /usr/bin/base64 
Binary files /usr/bin/tor and /usr/bin/base64 differ
— unknown (10/04/2015 13:44, исправлен 10/04/2015 13:46)   

И весь этот оффтоп здесь только ради того, чтобы долго и упорно искать лучшие способы, неопровержимо демонстрирующие изначальную бредовость утверждения:



Вместо того, чтобы ограничиться бездоказательным:



И успокоиться на этом.

Гость (10/04/2015 14:29)   
Есть случаи, когда файлы лежат на разных компьютерах, и копировать их в одно место только для того, чтобы сравнить, было бы глупым. В этом случае как раз чаще проще вычислить хэши, а потом визуально их сравнить.
— unknown (10/04/2015 14:34)   
А скопировать сами хэши и сравнить их диффом невизуально?
Гость (10/04/2015 15:20)   
Копируются обычно мышкой. Скопировал, открыл один файл, вставил. Скоприровал с другого места, открыл файл, вставил (или, если локально, записал в файл через редирект). Выполнил diff. ← много лишних действий.

Непонятно, на самом деле, ещё вот что. md5 — короткий хэш, его сравнивать легко и визуально. Современные хэши длинные. С одной стороны, вы долго и агрессивно утверждали, что длина хэша не имеет отношения к его коллизионной стойкости. Типа если обрезанный хэш даёт коллизии, то надо хэш лечить, а не удлиннять его. Тем не менее, по дефолту хэши становятся всё длиннее и длиннее. SHA-1 на 8 цифр длиннее, чем MD5. Что есть SHA-2 — сам не знаю. Семейство sha{224,256,384,512}sum? А какой вывод у SHA-3? Длинной до Луны?
— SATtva (10/04/2015 15:26)   
Вы сейчас троллите или как? Хэши должны быть защищены не только от перебора, но и от атак на основе парадокса дней рождений, что требует делать их вывод вдвое больше длины ключей шифров для обеспечения эквивалентной стойкости к брутфорсу.


Да.
— unknown (10/04/2015 15:39, исправлен 10/04/2015 15:41)   

Похоже, что жирно как обычно. Задача данного тролля — развести на трату времени и сил на доказывание чего-либо в как можно более пустых обсуждениях. А раз обсуждения технические, то и придраться не к чему — это же не оффтопик, в тематику ресурса укладывается.

Гость (10/04/2015 15:43)   
Никакого троллинга. Спрашиваю то, что не понимаю.

MD5 был создан не так давно. Его длина вывода — 32 символа, это 128 бит. Значит, он эквивалентен ключам длиной 64 бита. Времена DES что ли? SHA-1 — 40 символов, т.е. 160 бит ⇒ SHA-1 эквивалентен 80-ти битам шифра. Почему не 128-ми? Во времена SHA-1 требования иметь хотя бы 128 бит для гарантированной стойкости не было?


Когда вы начнёте задавать вопросы такого же уровня глупости по квантАм, натыкаю вас в ваш же пост.
— unknown (10/04/2015 15:56, исправлен 10/04/2015 15:59)   

А я и не начну, в этом всё и отличие. Или начну в форме: глупый я, как спрашивающий, by default; если есть время и желание — можете снизойти и популярно объяснить не отправляя читать маны Ааронсона и Нильсена с Чангом, а нет — так нет. Раз Чангов не читал — о чём со мной таким неосилятором вообще говорить то? Кроме как о «делайте по стндартам и не лезьте со своими понятиями».

Гость (10/04/2015 15:57)   

А ваша задача — газировать лужи[link17] то там[link18], то тут[link19], в каждом треде. Когда ловят — орать про «придирки»[link20]. Ваш «калькулятор» вылез уже минимум в трёх тредах, где вы с умном видом пишете чушь и делаете вид, что так и нужно. А вот взять тред, грамотно проработать и ответить на все вопросы, хотя бы как я это сделал тут[link21] — кишка тонка.
Гость (10/04/2015 16:00)   

А я в какой форме начал? Что в этом[link22] комментарии не так? Я опирался на то, что вы же сами здесь на форуме и писали.


Хороший пример. Вам впадлу прочитать вводные главы Н&Ч, а я никогда не осиливал даже Шнайера, и все мои познания про крипто ограничены этим форумом. Прекратим х*и мериться, может быть?
— unknown (10/04/2015 16:26, исправлен 10/04/2015 16:26)   

Форум — не справочник, расписывать каждый пост хотя бы как вики-документ я не умею. И я считаю ресурсы (время, силы) на коммуникацию. Если она неоптимальна и неприоритетна, то и ресурсов тратится минимум. Можете считать это недостатком, могу вообще на всякие неясные и гипотетические темы благоразумно помалкивать, отсылая только к проверенному и известному.

— SATtva (10/04/2015 16:27)   

Вопрос чисто исторический. Принимайте во внимание контекст (речь идёт о начале лихих 90-х) и тот факт, что до AES (конец 90-х) никакого публичного конкурсного процесса стандартизации не было, SHA-1 спустили из АНБ.

Ну, и поработайте над манерой ведения дискуссий. Когда вопрос формулируется подобным образом, хочется в худшем случае снести пост как флеймогенерирующий, а в лучшем — просто пройти мимо.
Гость (10/04/2015 21:47)   

Ну и прекрасно. А зачем тогда меня в троллинге обвинять? Мне, чтобы на последнее грамотно ответить, пришлось тут пару ночей посидеть. И, извините, мои посты были самыми содержательными по качеству и наполнению среди всех ваших. Теперь захожу в тред и читаю, что я, оказывается, сюда прихожу лишь бы «толсто потроллить». Ещё когда писал коммент[link23], хотел добавить «прочитал комменты в треде, и сразу чувствуется, как просел уровень ответов; автор пишет чушь — его не поправляют; кто-то спрашивает о конкретной вещи, которая имеет конкретное решение, а ему предлагают какую-то ерунду; сразу чувствуется, что меня в треде не было, развлекались unknown и SATtva, всё без придирок было»... но воздержался. Сейчас вот из-за моих «придорок» выяснится, что --skip позарез где-то нужен. А все спецы, которые переносили, правили и комментировали документ[link24], внимания на эту тонкость не только не обратили, но даже не намекнули на существовании такой проблемы.
Гость (10/04/2015 21:55)   

Кстати, вот нифига не троллинг. 1024[link25] бита. У меня один вопрос: нахрена? зачем? 512 бит недостаточно? Это как увеличивать размер ключа больше, чем на 256 бит — зачем это делать? Я правда не понимаю. И, да, я помню оценки на затраты энергии на полный перебор 2255. Как теперь это всё соотнести?
Гость (10/04/2015 22:08)   

А здесь[link26] пишут, что максимум по стандарту — 512 бит, а 1024 бит — размер состояния. 1024 бит в выводе хэша тоже было, просто не пошло под стандарт?
Гость (10/04/2015 23:15)   
spinore, не воспринимайте всерьез, вы просто себе такую репутацию создали – тролль троллей. Ваш вклад ощутим и оценен. Делайте сноски, акцентируя внимание на том, что вы не троллите. Не всегда понятен ваш тон.
— pgprubot (22/05/2015 10:34, исправлен 22/05/2015 10:41)   

Идея проста и понятна: LUKS-том состоит из заголовка и данных. Заголовок можно бессигнатурно (plain mode) зашифровать тем же самым паролем, что и сам LUKS, тогда сигнатур не будет вообще. При смене пароля нужно будет расшифровать заголовок, поменять LUKS-ключ в слотах на новый, а потом им же (т.е. тем же паролем) перешифровать заголовок LUKS'а (затереть, потом из бэкапа восстановить правильный заголовок, но уже на новый пароль в бессигнатурном шифровании). Этим достигается решение задачи, где есть всё:


  1. Отсутствие двойного шифрования.
  2. Отсутствие сигнатур.
  3. Cменяемость ключа на устройство через LUKS.
  4. Возможно быстро удалить данные с устройства, затерев его заголовк.
  5. Достаточно помнить всего один стойкий пароль для доступа к устройству.

Минус в том, что


  1. Это лишние команды (хотя и немного, и они простые), поэтому понадобится писать скрипт.
  2. Если не хочется небезопасно работать с паролем, при подключениии устройства его придётся вводить дважды: на расшифрование заголовка LUKS и, собственно, на расшифрование LUKS-тома.

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

— pgprubot (06/10/2015 19:38, исправлен 06/10/2015 19:46)   

На каком-то уровне протестированный пример:

#!/bin/sh
 
Device=YOUR_DEVICE
 
HeaderSize=4096
FullSize=$(blockdev --getsz $Device)
Size=$(( $FullSize - $HeaderSize ))
 
cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -b $HeaderSize \
  plainOpen $Device header_crypt
cryptsetup -q -c aes-xts-plain64 -s 512 -h sha512 --align-payload 0 \
  luksFormat /dev/mapper/header_crypt
 
dmsetup create device_space --table "0 $Size linear $Device $HeaderSize"
cryptsetup --header /dev/mapper/header_crypt --align-payload 0 \
  luksOpen /dev/mapper/device_space device_space_crypt
cryptsetup remove header_crypt
 
mkfs.ext4 /dev/mapper/device_space_crypt
mount /dev/mapper/device_space_crypt /media/mnt
(как подключать и отключать устройство — понятно из контекста). В принципе, в cryptsetup 1.6.7 это должно работать, и скрипт даже, возможно, удастся упростить (поначалу пришлось делать dmsetup, т.к. luks{Open,Format} не поддерживают --offset, но сейчас вспомнил про --align-payload — его можно применить для этих целей). В 1.6.6 это тоже работает, но на основном устройстве /dev/mapper/device_space всё равно адресация идёт с дополнительным оффсетом, т.е. --align-payload игнорируется: если он задан нулевым, то по факту будет 4096. Играя со значениями, можно его увеличить или чуть-чуть уменьшить, но он всё равно будет больше, чем 4000 секторов, поэтому нет смысла указывать эту опцию. А как это работает в 1.6.7 — протестировать не могу.


Всему виной, как всегда, баги:


O[link27]n 12/16/2011 08:14 AM, Arno Wagner wrote:
To my surprise, giving alignment --align-payload=1 (or = 2) results in a data-area staring at 0x101000, while --align-payload=0 gives 2MiB offset. Is this rounded up to multiples of 8? I had a brief look into the sources but did not find the relevant code. The full behaviour should go into the man-page under the explanation for --align-payload.

Align 0 should switch to internal default (4k).


Man page needs rewrite and many grammar and wording fixes...

S[link28]ee explanation in commit. In short, if you want detached header, you can either use data offset 0 (so whole data device is used) or there is always "reserved" space on data device of header size.

A[link29]llow to use --header option in all LUKS commands. The --header always takes precedence over positional device argument.

D[link30]isallow explicit small payload offset for detached header.

LUKS detached header has some limitations, one of them is that you cannot run some explicit check for data offsets without providing also data device.

Because luksDump and all key handle commands takes only metadata device (LUKS heaer device), it not easy to properly support data payload offset validation.

So if detached header is present for luksFormat, code now allows data payload 0 (IOW whole data device is used) and explicit offset larger than header+keyslots (the same as the header is on data device – so some space is wasted).

N.B. with detached header the option --align-payload is used directly without any round up caculations.

Fixes Issue#155.

В версии 1.6.6 ненужный оффсет можно удалить таким хаком:

#!/bin/sh
 
Device=YOUR_DEVICE
 
HeaderSize=4096
FullSize=$(blockdev --getsz $Device)
 
cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -b $HeaderSize \
  plainOpen $Device header_crypt
cryptsetup -q -c aes-xts-plain64 -s 512 -h sha512 \
  luksFormat /dev/mapper/header_crypt
 
dmsetup create device_space_full --table "0 $FullSize linear $Device 0"
cryptsetup --header /dev/mapper/header_crypt \
  luksOpen /dev/mapper/device_space_full device_space_crypt
cryptsetup remove header_crypt
 
mkfs.ext4 /dev/mapper/device_space_crypt
mount /dev/mapper/device_space_crypt /path/to
Т.е. при адресации основного пространства берём всё исходное устройство. Непосредственно его указать, правда, не получится, поэтому приходится создавать его dmsetup-алиас /dev/mapper/device_space_full, который уже используется для luksOpen.


Не самый тривиальный момент (и плохо описанный в документации) — то, что аргументом luksFormat является внешнее устройство (или файл) для хидера, а не то целевое блочное устройство, которое мы будем шифровать. Последнее вообще в этом случае не указывается в luksFormat-команде. Т.е. luksFormat создаёт только заголовок LUKS'а на чём-то (по сути — метод выведения мастер-ключа), а потом этот заголовок можно будет применять к любому блочному устройству для его шифрования. Т.е. не нужно писать --header {устройство,файл} в luksFormat-команде. man cryptsetup:


--header <device or file storing the LUKS header>
This option is only relevant for LUKS devices and can be used with the luksFormat...

For luksFormat with a file name as argument to --header, it has to exist...

Первая фраза противоречит второй. Т.е. нет такой опции --header у luksFormat — это будет ошибкой синтаксиса, если указать.


Общие замечания:


Вместо 4096 секторов можно взять любое большее число, чтобы не получить несовместимость с будущими версиями. Размер сектора (512) вряд ли в будущем изменится для обычных дисков. Вручную (без скриптов) такое подключение выполнять неудобно, да и само решение выглядит несколько грязным и переусложнённым — вероятно, нужно что-то более простое и практичное.

P.S. Ещё одна[link31] полезная заметка на тему внешних хидеров.

— pgprubot (07/10/2015 10:34, исправлен 07/10/2015 13:36)   

Ввиду предыдущего комментария мотивация вполне ясна. Более-менее рабочие оттестированные варианты (применение — на свой страх и риск):


  1. Инициализация устройства, скрипт plain_init.sh:
    #!/bin/sh
    # Initialise new plain mode encrypted device on some volume group
     
    DEVICE=$1
    DEVICE_NAME=$(echo $DEVICE |sed 's/^.*\///')
    CRYPT_SLOT_NAME=${DEVICE_NAME}_slot_crypt
    CRYPT_NAME=${DEVICE_NAME}_crypt
    AMOUNT_OF_KEY_SLOTS=8
     
    echo Device name is $DEVICE
    echo Device short name is $DEVICE_NAME
    echo Crypt slot name is $CRYPT_SLOT_NAME
    echo Device crypt name is $CRYPT_NAME
    set -x
     
    # Clean all slots
    dd if=/dev/urandom of=$DEVICE bs=512 count=$AMOUNT_OF_KEY_SLOTS && \
     
    # Initialize the first slot
    cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -b 1 \
      plainOpen $DEVICE $CRYPT_SLOT_NAME && \
     
    ## Initialize the second slot
    #CRYPT_SLOT_NAME_2=${CRYPT_SLOT_NAME}_2
    #cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -b 1 -o 1 -p 1 --shared \
    #  plainOpen $DEVICE $CRYPT_SLOT_NAME_2
    #dd if=/dev/mapper/$CRYPT_SLOT_NAME of=/dev/mapper/$CRYPT_SLOT_NAME_2
    #cryptsetup remove $CRYPT_SLOT_NAME_2
     
    # Open target device
    cryptsetup -c aes-xts-plain64 -s 512 -o $AMOUNT_OF_KEY_SLOTS \
      -d /dev/mapper/$CRYPT_SLOT_NAME --shared \
      plainOpen $DEVICE $CRYPT_NAME && \
    cryptsetup remove $CRYPT_SLOT_NAME && \
     
    mkfs.ext4 /dev/mapper/$CRYPT_NAME
    Применение:
    # /path/to/plain_init.sh /dev/VG_name/LV_name
  2. Открытие устройства, скрипт plain_open.sh:
    #!/bin/sh
    # Open plain mode encrypted device on some volume group using slot 1
     
    DEVICE=$1
    DIR=$2
    DEVICE_NAME=$(echo $DEVICE |sed 's/^.*\///')
    CRYPT_SLOT_NAME=${DEVICE_NAME}_slot_crypt
    CRYPT_NAME=${DEVICE_NAME}_crypt
    AMOUNT_OF_KEY_SLOTS=8
     
    set -x
    # Open the first slot
    cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -b 1 \
      plainOpen $DEVICE $CRYPT_SLOT_NAME && \
     
    # Open target device
    cryptsetup -c aes-xts-plain64 -s 512 -o $AMOUNT_OF_KEY_SLOTS \
      -d /dev/mapper/$CRYPT_SLOT_NAME --shared \
      plainOpen $DEVICE $CRYPT_NAME && \
    cryptsetup remove $CRYPT_SLOT_NAME && \
     
    mount /dev/mapper/$CRYPT_NAME $DIR
    Применение:
    # /path/to/plain_open.sh /dev/VG_name/LV_name /path/to
  3. Отключение устройства, скрипт plain_close.sh:
    #!/bin/sh
    # Close plain mode encrypted device on some volume group
     
    DEVICE=$1
    DEVICE_NAME=$(echo $DEVICE |sed 's/^.*\///')
    CRYPT_NAME=${DEVICE_NAME}_crypt
     
    set -x
    umount /dev/mapper/$CRYPT_NAME && \
    cryptsetup remove $CRYPT_NAME
    Применение:
    # /path/to/plain_close.sh /dev/VG_name/LV_name

Количество слотов «кустарного LUKS'а» сейчас 8, это заголовок размером 4KB (у аутентичного LUKS — 4k секторов, т.е. 2 MB), но можно поставить один или два, тогда оверхед будет, соответственно, 0.5KB или 1KB. Правда, при этом mkfs.ext4 будет ругаться на выравнивание и грозиться проблемами со скоростью работы:


/dev/mapper/$CRYPT_NAME alignment is offset by 3584 bytes.
This may result in very poor performance, (re)-partitioning suggested.

чего нет при 8-ми слотах.


Открытие устройства — по сути, три команды, не требующие каких-то вычисляемых переменных, как в примере с LUKS, т.е. их легко ввести без скрипта вручную. Что ещё хорошо — для plain mode поддерживается --shared, которым не воспользоваться c LUKS (поэтому там понадобилась дополнительная команда — хак с отображением пространства с помощью dmsetup).


Для удобной смены пассфразы[link11] нужно минимум 2 слота. Пример с добавлением второго слота выше приведён (смысл понятен), но закомменчен. Т.е. расшированное содержимое всех использованных слотов-секторов одинаково (оно и есть мастер-ключ), но они зашифрованы разными пассфразами. Может возникнуть ошибка, когда в разных слотах используется одинаковая пассфраза (к примеру, в первом и во втором), тогда шифрованное содержимое у них будет одинаковым, что разрушит бессигнатурность/отрицаемость. Для этого применён трюк -o 1 -p 1 вместо просто -o 1 для второго слота. В этом случае даже при одинаковых пассфразах шифртексты будут разными. Это соответствует[link33] в точности тому, как если бы сразу расшифровали два первых слота-сектора одной пассфразой (-b 2 -o 0 -p 0) и увидели совпадение содержимого первого расшифрованного сектора со вторым на открывшемся (крипто)устройстве. Т.е. «бессигнатурный криптораздел» для второго слота-сектора состоит не из него самого, а из него + первый сектор, поэтому мы делаем отступ (-p 1) — пропускаем первый сектор, чтобы расшифровать только второй.


Возможно, есть ещё какие-то нетривиальные уязвимости схемы, но пока их не вижу. Непосредственное хранение мастер-ключа на диске (пусть и шифрованное) тоже немного смущает:


  1. Это повышает риск утечки мастер-ключа по сравнению со случаем, когда используется LUKS.
  2. Можно ли шифровать мастер-ключом мастер-ключ? Но даже если он будет где-то записан на основном шифрованном устройстве, где он используется, вряд ли это случится в первом секторе, т.е. IV всё равно будет каким-то нетривиальным.

UPD: Поскольку мастер-ключи разных криптоустройств генерятся случайным образом и всегда будут разными, plain-текст, зашифрованный в «слотах», тоже всегда будет разным (т.е. два разных криптоустройства с одинаковым мастер-ключом недопустимы). Следовательно, можно использовать одинаковые пассфразы для разных криптоустройств — ключами, выводимыми из этих пассфраз, всегда будут шифроваться разные мастер-ключи. Т.е. это[link34] предупреждение* неактуально для слотов в силу специфики их содержимого.


Кстати, в варианте с LUKS'ом[link35] какое-то частичное совпадение plain-текстов в слотах всё равно будет (хотя бы из-за общих метаданных и сигнатур), поэтому там предупреждение[link34] остаётся в силе, т.е. нельзя использовать одинаковые пассфразы для бессигнатурного слоя разных устройств.


* В plain mode одинаковые пассфразы ведут к одинаковым ключам, а одинаковые ключи на одинаковых plain-текстах дадут одинаковые шифртексты.


Ссылки
[link1] https://ru.wikipedia.org/wiki/Дискета

[link2] http://www.pgpru.com/comment91433

[link3] https://packages.debian.org/wheezy/hashalot

[link4] http://www.pgpru.com/comment79707

[link5] http://www.pgpru.com/comment82492

[link6] http://www.pgpru.com/comment86705

[link7] http://www.pgpru.com/comment59119

[link8] http://www.pgpru.com/comment58602

[link9] http://www.pgpru.com/comment73503

[link10] http://www.pgpru.com/comment79306

[link11] http://www.pgpru.com/comment82462

[link12] http://www.pgpru.com/comment73746

[link13] http://www.pgpru.com/comment73786

[link14] https://en.wikipedia.org/wiki/Anonymous_named_pipe

[link15] http://www.pgpru.com/comment91564

[link16] http://www.pgpru.com/comment91580

[link17] http://www.pgpru.com/comment91425

[link18] http://www.pgpru.com/comment90990

[link19] http://www.pgpru.com/comment91149

[link20] http://www.pgpru.com/comment91522

[link21] http://www.pgpru.com/comment91567

[link22] http://www.pgpru.com/comment91659

[link23] http://www.pgpru.com/comment91464

[link24] http://www.pgpru.com/biblioteka/rukovodstva/zaschitadiska/tailsotricaemoehraneniedannyh

[link25] http://www.pgpru.com/comment48087

[link26] https://en.wikipedia.org/wiki/SHA-3

[link27] http://comments.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt/5545

[link28] https://gitlab.com/cryptsetup/cryptsetup/issues/155

[link29] https://www.kernel.org/pub/linux/utils/cryptsetup/v1.6/v1.6.7-ReleaseNotes

[link30] http://upstream.rosalinux.ru/changelogs/libcryptsetup/current/changelog.html

[link31] https://skrilnetz.net/bullet-proof-data-encryption-with-luks-and-a-detached-header/

[link32] http://www.pgpru.com/comment91448

[link33] http://www.pgpru.com/comment94040

[link34] http://www.pgpru.com/comment86820

[link35] http://www.pgpru.com/comment94043