Шифрование идентификатора без IV - PullRequest
0 голосов
/ 02 февраля 2020

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

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

Есть ли шифр, который позволяет это и достаточно безопасно или есть способ достичь этого без сохранения каких-либо дополнительных данных?

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

1 Ответ

2 голосов
/ 03 февраля 2020

Судя по вашему вопросу и комментариям, у вас есть следующие требования:

  • Значение будет меньше 20 символов (я предполагаю, что здесь 20 однобайтовых символов UTF-8) .
  • Значение должно быть надежно зашифровано.
  • Должна быть возможность расшифровать значение.
  • Шифрование должно быть определено c для данного ключа.

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

В этом случае Rijndael с размером блока 192 бита - это то, что я выбрал бы, но вы могли бы бороться, чтобы найти реализации. Если вам не нужно быть консервативным с длиной, Rijndael с размером блока 256 бит тоже подойдет.

Итак, просто:

  • Шифрование с помощью Rijndael (192 или 256 бит размер блока, размер ключа по вашему выбору) с использованием отступа PKCS # 5 (или 7).
  • Расшифруйте с помощью того же самого.

Не:

  • Позвольте вашим операциям шифрования использовать несколько блоков. Это может потенциально привести к распознаванию образов и другим трюкам для манипулирования и предоставления данных в ECB.
  • Разрешить третьим сторонам отправлять и просматривать пары открытого текста и зашифрованного текста. Опять же, не такая большая проблема, когда вы работаете в одном блоке, но позволяете третьим сторонам отправлять что-то для шифрования и затем просматривать результат, при определенных обстоятельствах это может раскрыть весь открытый текст.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...