Симметричная криптография и соль

Мне нужно зашифровать двусторонние (симметричные) отдельные токены. Ожидается, что эти токены будут повторяться (например, это имена людей), но я не хочу, чтобы злоумышленник сделал вывод, какие зашифрованные токены произошли от одних и тех же исходных токенов. Соль — это способ односторонней криптографии (хеширования).

Есть ли метод, который может работать в симметричной криптографии, обходной путь или альтернатива?


person yannisf    schedule 10.10.2014    source источник


Ответы (3)


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

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

person ntoskrnl    schedule 10.10.2014
comment
Обратите внимание, что вам может потребоваться дополнить имена пользователей до определенного размера, если вы не согласны с утечкой информации о размере имени. - person Maarten Bodewes; 10.10.2014
comment
@ntoskmi Очень плотный ответ. Не могли бы вы указать ресурс, который мог бы более подробно рассказать о том, что такое ECB и как IV известен во время расшифровки? - person yannisf; 11.10.2014
comment
@yannisf В Википедии есть статья о режимах работы. Обратите особое внимание на набор изображений с изображением пингвина. Вы можете просто отправить IV вместе с зашифрованным текстом; это не нужно держать в секрете. - person ntoskrnl; 11.10.2014
comment
@ntoskrnl См. режим ECB, прокрутите вниз до Penguin. - person zaph; 28.11.2016

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

Я рекомендую использовать режим GCM, так как это эффективная схема шифрования с проверкой подлинности. Выполнение криптографических функций с данными, не прошедшими проверку подлинности, может привести к проблемам с безопасностью, поэтому лучше всего использовать схему шифрования с проверкой подлинности, такую ​​как GCM. Обратите внимание, что эта схема шифрования вместе с другими схемами CPA-SECURE обеспечит вам защиту от злоумышленника, который захочет узнать значение зашифрованного токена.

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

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

Однако будьте осторожны, вы не можете использовать хеш-функции и схемы симметричного шифрования взаимозаменяемо, поскольку они созданы для совершенно разных целей. Будьте осторожны с тем, как вы делитесь ключом, и помните, что, как только злоумышленник узнает ключ, в зашифрованном тексте нет ничего случайного.

-ПРИМЕЧАНИЕ- Неправильное использование шифрования. Если каждый пользователь использует один и тот же ключ для шифрования своего токена, он может просто расшифровать токен всех остальных и увидеть имя, которое его сгенерировало. Чтобы быть в безопасности, каждый пользователь должен шифровать с помощью другого ключа, поэтому теперь вам нужно каким-то образом хранить и управлять ключом для каждого пользователя. Это может быть очень болезненно, и вы должны быть очень осторожны с этим.

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

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

person omzy    schedule 01.05.2018

Предполагая, что шифруются только токены (то есть они не встроены в более крупную структуру данных), тогда можно использовать векторы инициализации (IV).

Их довольно просто понять: пусть M будет вашим токеном, дополненным в соответствии с размером блока, используемым в алгоритме симметричного шифрования (я предполагаю, что это AES), а IV будет случайным массивом битов, а также размером блока шифрования.

Затем вычислите C = AES_ENCRYPT(M xor IV, K), где C — зашифрованные данные, а K — симметричный ключ. Таким образом, одно и то же сообщение M не будет шифроваться одинаково несколько раз, поскольку IV каждый раз получается случайным образом.

Чтобы расшифровать M, просто вычислите M = (AES_DECRYPT(C, K) xor IV).

Конечно, и IV, и K должны быть известны во время расшифровки. Самый обычный способ передачи IV — просто послать его вместе с зашифрованным текстом. Это не ставит под угрозу безопасность, это очень похоже на сохранение солт-значения, поскольку ключ шифрования останется неизвестным для всех остальных.

person agubelu    schedule 26.11.2016
comment
Существует предположение, что данные, которые нужно зашифровать, меньше или равны размеру блока, что может быть не так, также нет помощи в том, как дополнить данные таким образом, чтобы они были безопасными и могли быть удалены. по расшифровке. Общий метод заключается в использовании режима CBC с параметрами заполнения PKCS#7, где IV представляет собой другое случайное значение для каждого шифрования и добавляется к зашифрованным данным. - person zaph; 26.11.2016
comment
Вы правы, возможно, это было ошибочное предположение. В таких случаях использование общего анализа крови действительно настоятельно рекомендуется. Чтобы уточнить, режим CBC состоит в выполнении тех же операций, которые описаны в моем ответе, но с использованием предыдущего зашифрованного блока для операции xor вместо вектора инициализации. - person agubelu; 26.11.2016