Почему PostgreSQL pgp_sym_encrypt возвращает различный вывод, хотя и вызывается для одного и того же ввода?

685
Ashish Patel

Я получаю разные результаты при выполнении команды PostgreSQL pgp_sym_encryptс тем же открытым текстом и парольной фразой в качестве ввода. При расшифровке этих разных результатов с помощью одной и той же парольной фразы, я получаю верный простой текст.

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

Та же проблема с простым текстом, уникальным ключом и сессионным ключом также.

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

Пример:

pgp_sym_encrypt('12345','key1') 

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

2
Мне было довольно трудно понять твой вопрос. Я надеюсь, что я не изменил значение при редактировании. В любом случае, я не мог понять смысл «Та же проблема с простым текстом, уникальным ключом и ключом сеанса». Jens Erat 6 лет назад 0

1 ответ на вопрос

2
Jens Erat

OpenPGP шифрование

В OpenPGP сообщение не зашифровано напрямую с помощью ключевой фразы. Вместо этого случайный сеансовый ключ генерируется как ключ для симметричного шифрования сообщения.

Этот ключ сеанса теперь шифруется с использованием ключевой фразы. Применяя такой двухэтапный подход, можно зашифровать сообщение один раз, но разрешить дешифрование с использованием разных закрытых ключей или парольных фраз, добавив зашифрованную копию ключа сеанса один раз. Для более глубокого понимания того, как создаются сообщения OpenPGP, взгляните на RFC 4880, OpenPGP и вывод зашифрованного сообщения gpg --list-packetsи pgpdumpдля него (оба они печатают информацию в пакетах OpenPGP).

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

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

Уникальное ограничение на зашифрованный вывод

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

Похожие вопросы