Использование постоянного IV с одноблочным шифрованием

У меня есть много маленьких секретов, которые я хочу хранить в зашифрованном виде в базе данных. У клиента базы данных будут ключи, а сервер базы данных не будет заниматься шифрованием и дешифрованием. Все мои секреты составляют 16 байтов или меньше, что означает только один блок при использовании AES. Я использую константу IV (и ключ), чтобы сделать шифрование детерминированным, и моя причина для того, чтобы делать детерминированное шифрование, состоит в том, чтобы иметь возможность легко запрашивать базу данных с использованием зашифрованного текста и убедиться, что один и тот же секрет не сохраняется дважды (делая столбец УНИКАЛЬНЫМ). Насколько я понимаю, не должно быть никаких проблем с этим, пока ключ является секретным. Но я хочу быть уверен: я прав или нет? В случае, если я ошибаюсь, какие атаки могут быть сделаны?

Кстати: хэши здесь совершенно бесполезны из-за относительно небольшого числа возможных открытых текстов. С хэшем было бы тривиально получить исходный открытый текст.

3 ответа

Идеальным шифром для сообщений длиной n битов является перестановка 2n последовательностей из n битов, выбранных случайным образом из 2n! такие перестановки. "Ключ" - это описание того, какая перестановка была выбрана.

Предполагается, что защищенный блочный шифр неотличим от идеального шифра, а n - размер блока. Для AES n = 128 (т.е. 16 байтов). AES должен быть безопасным блочным шифром.

Если все ваши секреты имеют длину ровно 16 байтов (или менее 16 байтов, с некоторыми соглашениями о заполнении, чтобы однозначно расширить их до 16 байтов), тогда вам нужен идеальный шифр, и AES "как сам по себе" должен подойти. В распространенных реализациях AES, в которых требуется применять заполнение и обрабатывать произвольно длинные потоки, вы можете получить одноблочное шифрование, запросив режим ECB или режим CBC с IV с нулем.

Все проблемы, связанные с IV, и то, почему режимы цепочки, такие как CBC, были необходимы, в первую очередь, связаны с многоблочными сообщениями. AES шифрует 16-байтовые сообщения (не больше, не меньше): режимы цепочки предназначены для эмуляции идеального шифра для более длинных сообщений. Если в вашем приложении все сообщения имеют длину ровно 16 байтов (или они короче, но вы добавляете заполнение), то вам просто нужен "сырой" AES; и фиксированный IV является достаточно близкой эмуляцией необработанного AES.

Обратите внимание, что следующее:

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

  • Шифрование обеспечивает конфиденциальность, а не целостность. В большинстве моделей безопасности злоумышленники могут быть активными (т. Е. Если злоумышленник может прочитать базу данных, он, вероятно, тоже может в нее записать). Активные атаки открывают целый ряд проблем: например, что может произойти, если злоумышленник обменяет некоторые ваши секреты в базе данных? Или изменяет некоторые случайно? Шифрование, как всегда, легкая часть (не то, чтобы это действительно "легко", но это намного проще, чем остальная часть работы).

Если сборка общедоступна или может стать таковой, ваш ключ и IV могут быть обнаружены с помощью Reflector для раскрытия исходного кода, который его использует. Это было бы главной проблемой, если бы данные действительно были секретными. Можно запутать MSIL, но это только усложняет поиск; он по-прежнему должен быть компьютерным, поэтому вы не сможете зашифровать его.

Статический IV сделает вашу реализацию уязвимой для частотных атак. См. Для шифрования AES CBC, какова важность IV?

Другие вопросы по тегам