#postgresql #encryption #aes-gcm #pgcrypto
#postgresql #шифрование #aes-gcm #pgcrypto
Вопрос:
Я пытаюсь расшифровать сообщение с помощью pgcrypto, которое зашифровано с помощью AES GCM 256.
Технические характеристики шифрования:
Encryption algorithm AES
Key [secret of listener] (64-character-long hexadecimal string in configuration)
Key length 256 bits (32 bytes)
Block mode GCM
Padding None
Initialization vector In HTTP header (X-Initialization-Vector)
Authentication tag In HTTP header (X-Authentication-Tag)
Итак, я получаю:
- Тело
- Клавиша
- iv_header
- auth_tag
Я попробовал следующее
with base as (
select
'F8E2F759E528CB69375E51DB2AF9B53734E393' as body,
'000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F' as key,
'3D575574536D450F71AC76D8' as iv_header,
'19FDD068C6F383C173D3A906F7BD1D83' as auth_tag
),
out as (
select
decrypt_iv(
convert_to(concat(decode(body,'hex'),decode(auth_tag,'hex')),'LATIN1'),
decode(key, 'hex'),
decode(iv_header, 'hex'),
'aes/pad:none'
)
from base
)
select * from out
Я продолжаю получать сообщение об ошибке decrypt_iv error: Data not a multiple of block size
, в то время как я ожидал бы получить закодированное сообщение {"type": "PAYMENT"}
Я ожидаю, что что-то пойдет не так при декодировании и объединении body
и auth_tag
, но не могу понять, что.
Несколько заметок о том, что / почему я это сделал
- Я
auth_tag
body
связываю это с тем, как несколько источников описывают это именно так. - Я использую
convert_to
функцию, поскольку это кажется единственным способом объединения двухbytea
значений
Мне удается расшифровать это сообщение на других языках (например, Snowflake или Python)
Если кто-нибудь видит, что я делаю неправильно, или имеет какие-то указания, это высоко ценится.
Комментарии:
1. Не могли бы вы показать код, который делает это на python?
2. Привет @jjanes, образец для разных языков можно найти здесь peachpayments.docs.oppwa.com/tutorials/webhooks /… Мне кажется, что пример Scala может быть полезен, поскольку он также добавляет auth_tag к зашифрованному телу. Надеюсь, это прояснит ситуацию.
Ответ №1:
pgcrypto говорит, что поддерживает только cbc и ecb. Я не криптограф, но я не думаю, что любой из них — это то же самое, что и GCM. Поэтому я не думаю, что вы можете сделать это с помощью pgcrypto. Я не знаю, почему это приводит к точной ошибке, которую вы получаете, но это также меня не удивляет.
Если бы мне действительно нужно было сделать это внутри базы данных, я думаю, я сделал бы это, написав функцию с помощью pl/python3u
.
Комментарии:
1. Спасибо @jjanes, это имеет смысл, я надеялся, что GCM будет вариантом CBC / EBC. Я думаю, мы просто сделаем расшифровку вне базы данных. Спасибо, Крис