Где хранить iv, если я могу запомнить только пароль?
Я хочу хранить важную мне информацию в интернете в зашифрованном виде, чтобы я мог легко получить к ней доступ. То есть, это условно страничка на github pages, где лежат в общем доступе зашифрованные данные и поле для ввода пароля. Я ввожу пароль и эти данные расшифровываются с помощью javascript. Всё происходит на стороне клиента, то есть на моей стороне.
Это всё очень удобно до момента, когда у меня есть только поле "пароль". К примеру, в javascript Web Crypto API (нативная поддержка) исключено из методов AES-ECB, который может существовать без iv, так как они не считают его достаточно безопасным. Я могу использовать библиотеку crypto-js, в которой ECB есть, но здесь возникает вопрос безопасности.
Следовательно, я должен смотреть в сторону GCM или CBC, где обязательным условием для расшифровки является наличие iv. Запомнить iv я не смогу, но тогда я не знаю, где и как его хранить. Подскажите, какие есть варианты решения данной проблемы?
где обязательным условием для расшифровки является наличие iv.
А именно, того же IV, что был использован при шифровании.
какие есть варианты решения данной проблемы?
- использовать фиксированный IV (например все нули).
- генерировать его из хранимых данных (например какой-нибудь хеш от пароля). В википедии упоминается похожий вариант: "a cipher or a hash function is used to generate the IVs from the key and the current sector number".
- использовать режим CTR.
IV не секретен и обычно хранится вместе с зашифрованными данными. Если IV не передается / не хранится отдельно, то, как правило, он находится в начале блоба с зашифрованными данными.
accountnujen, зачем его делать одинаковым? IV делают рандомным, просто хранят его вместе с результатом шифрования. Даже если вы дважды шифруете одни и те же данные - получите два разных результата с разными IV.
Владимир Дубровин, ок, он разный, но он известен всем. Какой смысл тогда в нём? На сколько я сейчас понимаю: знать iv - это тоже самое, что знать часть пароля: pass****.
accountnujen, IV как раз и нужен для того чтобы каждый раз получался разный результат и нельзя было между собой сравнить два шифрованных блока, аналогично соли в хеше. Поэтому сам по себе IV не секретен и хранят его так же как и соль, с результатом.
Владимир Дубровин, соль, в моём понимании, нужна исключительно для защиты от радужных таблиц в случае с hash'ом. А вот iv мне не совсем понятен, когда он доступен всем. Ну это тоже самое, если бы мне сразу сказали соль: ну спасибо, теперь я знаю соль, теперь мне проще будет перебрать пароль.
Возможно iv нужен на случай, если я отправляю множество сообщений, тогда если человек смог расшифровать старое сообщение - он не сможет расшифровать новые, однако это не моя ситуация. В моём положении проблема иная: злоумышленник знает структуру и знает часть текста. Структура у меня повторяющаяся, поэтому ему не нужно сравнивать два разных шифра, он может сравнивать части одного большого (а он у меня большой)
Соль хранится вместе с хешем, например в
$5$MnfsQ4iN$ZMTppKN16y/tIsUYs/obHlhdP.Os80yXhTurpBMUbA5
MnfsQ4iN это соль, и при бруте она известна.
От радужных таблиц она защищает именно потому что с разной солью получаются разные хеши одного и того же пароля, нельзя их заранее просчитать и нельзя брутить всю базу паролей одновременно, каждый пароль надо брутить поотдельности.
У IV ровно такое же назначение, получать разные шифротексты при отдинаковых входных данных. IV не должен быть секретным, он должен быть уникальным.
Простой пример такой. Например вы хотите не хешировать пароли, а шифровать (например на стороне клиента) и у вас хранится 100000 шифрованных паролей. Без IV одинаковые пароли будут иметь одинаковое значение в шифрованном виде, и по повторениям одного и того же шифротекста можно будет не только увидеть для каких учеток заданы слабые часто используемые пароли, но и довольно легко угадать их, зная примерное распределение словарных паролей по частоте использования. Примерно то же для файлов, например есть у вас 100 конфигурационных файлов с единственной строкой enabled=0 или enabled=1, без IV или со статическим IV можно будет сказать какая у вас конфигурация, если угадать значение хотя бы одном файле (что обычно не проблема). Со случайным IV одинаковые файлы или пароли будут иметь разное значение шифра.
В режимах OFB и CTR IV еще более критичен, зная содержимое одного файла можно расшифровать как минимум часть содержимого любого другого зашифрованного с тем же IV. Но при этом сам по себе IV все равно не секретен, и его так же можно хранить вместе с шифрованными данными.