Кажется, вы просите какой-то тип открытого ключа конвергентное шифрование, для которых существуют различные схемы.
Однако все такие схемы неизбежно уязвимы для атак с угадыванием методом грубой силы, если количество правдоподобных открытых текстов невелико — скажем, менее септиллиона ($10^{24} — 2^{80}$).
В частности, злоумышленник, у которого есть конвергентный зашифрованный текст (или просто криптографический хеш) сообщения и открытый ключ (если есть), используемый для его генерации, может угадать правдоподобный открытый текст, зашифровать его и сравнить с зашифрованным текстом/хэшем, чтобы проверить, или не их предположение было правильным.
Типичный центральный процессор для настольных ПК может выполнять порядка миллиарда ($10^9 — 2^{30}$) шифров в секунду, поэтому, если число вероятных открытых текстов меньше этого значения, схема вообще не обеспечивает реальной безопасности. И если злоумышленник готов потратить немного больше времени и/или купить (или украсть) немного больше вычислительной мощности, чем это, он, вероятно, сможет пройти методом грубой силы через тысячу, миллион или миллиард раз больше открытых текстов. Кроме того, одновременная атака на несколько зашифрованных текстов таким же образом выполняется так же быстро, как и атака на один.
А растяжка ключей Схема может использоваться для замедления таких атак, но только за счет замедления легитимных операций шифрования (и дешифрования) примерно на тот же коэффициент. Так, например, если вы можете жить с одной операцией шифрования, занимающей примерно одну ЦП-секунду, вы можете заставить злоумышленника также использовать около одной ЦП-секунды (плюс-минус 10 или 100 в зависимости от эффективности реализации), чтобы угадать и проверить единственный правдоподобный открытый текст. Но это по-прежнему означает, что злоумышленник, имеющий доступ к 100 процессорам (или, возможно, к одному быстрому графическому процессору), может протестировать миллион возможных открытых текстов примерно за три часа.
Как правило, такие данные, как почтовые адреса, имена пользователей, номера телефонов и т. д., имеют довольно низкую кардинальность — и, что еще хуже, даже если их могут быть миллионы или миллиарды. возможное адреса, т. вероятно используемых комбинаций адресов гораздо меньше, и их легко обнаружить с помощью общедоступных карт и баз данных адресов. Таким образом, на практике использование криптографического хеширования или конвергентного шифрования для псевдонимизации таких данных обречено на неудачу.
Вместо этого вы можете сделать одно из следующего (примерно в порядке убывания предпочтений):
Не храните и не обрабатывайте такие данные, если можете этого избежать.
Если вам необходимо хранить такие данные, храните их в зашифрованном виде (используя обычный атака с выбранным открытым текстом устойчивую схему шифрования) и расшифровать его только для обработки в защищенной системе. Надежно храните ключ дешифрования.
Если вы должны псевдонимизировать такие данные, например. для обработки ненадежными третьими сторонами предпочтительно делать это, связывая каждый элемент данных (адрес, имя пользователя и т. д.) с полностью случайным идентификатором и сохраняя ассоциации в зашифрованной базе данных. Обеспечьте безопасность этой базы данных ассоциаций, как описано выше.
В качестве альтернативы вы можете сгенерировать псевдонимные идентификаторы, применив ЧПИ (такие как HMAC или какое-то растяжение клавиш КДФ) к элементам конфиденциальных данных с секретным ключом. Если это так, вы должен защитить ключ PRF от компрометации, так как его можно использовать для депсевдонимизации всех данных.
В любом случае псевдонимизация «у источника», как правило, невозможна. Вместо этого вы должны шифровать любые конфиденциальные данные, используя безопасную схему с открытым ключом в точке сбора (которая должна Только имеют доступ к открытой половине пары ключей), собирают эти зашифрованные данные в безопасную систему и расшифровывают, обрабатывают и (необязательно) псевдонимизируют их там.