Небезопасно ли передавать вектор инициализации и соль вместе с зашифрованным текстом?
Я новичок в реализации шифрования и все еще изучаю основы, похоже.
Мне нужны возможности симметричного шифрования в моей базе кода с открытым исходным кодом. Эта система состоит из трех компонентов:--1-->
- сервер, который хранит некоторые пользовательские данные и информацию о том, зашифрован ли он, и как
- клиент C#, который позволяет пользователю шифровать свои данные с помощью простого пароля при отправке на сервер и расшифровывать с тем же пароль при получении
- клиент JavaScript, который делает то же самое и, следовательно, должен быть совместим с методом шифрования клиента C#
глядя на различные библиотеки JavaScript, я наткнулся на SJCL, у которого есть прекрасная демо-страница здесь:http://bitwiseshiftleft.github.com/sjcl/demo/
из этого кажется, что клиент должен знать (помимо используемого пароля), чтобы расшифровать зашифрованный текст есть:
- вектор инициализации
- любая соль, используемая в пароле
- размер ключа
- сила аутентификации (я не совсем уверен, что это такое)
относительно безопасно ли хранить все эти данные с зашифрованным текстом? Имейте в виду, что это кодовая база с открытым исходным кодом, и я не могу разумно скрыть эти переменные, если не попрошу пользователя запомнить их (да, правильно).
любые советы оцененный.
1 ответов
векторы инициализации и соли называются такими, а не ключами, именно , потому что их не нужно держать в секрете. Безопасно и обычно кодировать такие данные вместе с зашифрованным / хэшированным элементом.
то, что нужно IV или salt, должно использоваться только один раз с заданным ключом или паролем. Для некоторых алгоритмов (например, шифрования CBC) могут быть некоторые дополнительные требования, выполняемые путем выбора IV случайным образом, с равномерной вероятностью и криптографически сильный генератор случайных чисел. Однако конфиденциальность не является необходимым свойством для IV или соли.
симметричного шифрования редко бывает достаточно для обеспечения безопасности; само по себе шифрование защищает от пассивные атаки, где атакующий наблюдает, но не вмешивается. Чтобы защитить от активные атаки, вам также нужна какая-то проверка подлинности. SJCL использует режимы шифрования CCM или OCB2, которые сочетают шифрование и аутентификацию, так что все в порядке. Этот "сила аутентификации" - это длина (в битах) поля, предназначенного для аутентификации в зашифрованном тексте; сила" 64 бит " означает, что злоумышленник, пытающийся изменить сообщение, имеет максимальную вероятность 2-64 преуспеть в этом, не будучи обнаруженным механизмом аутентификации (и он не может знать, удалось ли ему без попытки, т. е. с измененным сообщением, отправленным кому-то, кто знает ключ/пароль). Этого достаточно для большинства целей. Больше сила аутентификации подразумевает больший зашифрованный текст, примерно на ту же сумму.
Я не смотрел на реализацию, но из документации кажется, что авторы SJCL знают свою профессию и делали все правильно. Я рекомендую использовать его.
помните обычные предостережения паролей и Javascript:
Javascript-это код, который выполняется на стороне клиента, но загружается с сервера. Это требует что загрузка каким-то образом защищена от целостности; в противном случае злоумышленник может ввести свой собственный код, например, простой патч, который также регистрирует копию пароля, введенного пользователем где-то. На практике это означает, что код SJCL должен обслуживаться через сеанс SSL/TLS (т. е. HTTPS).
-
пользователи-это люди, и люди плохо выбирают пароли. Это ограничение человеческого мозга. Кроме того, компьютеры продолжают получать все больше и больше мощный, в то время как человеческий мозг остается более или менее неизменным. Это делает пароли все более слабыми к атака по словарю, т. е. исчерпывающий поиск паролей (злоумышленник пытается угадать пароль пользователя, пытаясь "вероятные" пароли). Зашифрованный текст, созданный SJCL, может использоваться в словарь атаки: злоумышленник может "пробовать" пароли на своих компьютерах, не проверяя их на вашем сервере, и он ограничен только своими собственными вычислительные способности. SJCL включает в себя некоторые функции, чтобы сделать автономные атаки словарь сложнее:
- SJCL использует соль, которая предотвращает разделение затрат (обычно известное как "предварительно вычисленные таблицы", в частности "радужные таблицы", которые являются особым видом предварительно вычисленных таблиц). По крайней мере, злоумышленнику придется заплатить полную цену поиска словаря за каждый атакованный пароль.
- SJCL использует соль неоднократно, путем хэширования его паролем и все для того, чтобы получить ключ. Это то, что SJCL называет "фактором укрепления пароля". Это делает преобразование "пароль-ключ" более дорогим для клиента, но и для злоумышленника, что является точкой. Сделать трансформацию ключа в 1000 раз дольше означает, что пользователю придется ждать, может быть, полсекунды; но это также умножает на 1000 стоимость для злоумышленника.