【问题标题】:Decrypting AES GCM 256 with pgcrypto (PostgresQL)使用 pgcrypto (PostgresQL) 解密 AES GCM 256
【发布时间】:2021-03-01 11:58:46
【问题描述】:

我正在尝试使用 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"}

我预计bodyauth_tag 的解码和连接会出现问题,但不知道是什么问题。

关于我这样做/为什么这样做的一些说明

  • 我将auth_tagbody 连接起来,因为一些消息来源是这样描述的。
  • 我使用 convert_to 函数,因为它似乎是连接两个 bytea 值的唯一方法

我设法用其他语言(即 Snowflake 或 Python)解密此消息

如果有人看到我做错了什么或有一些指示,我们将不胜感激。

【问题讨论】:

  • 你能展示一下python中的代码吗?
  • 嗨@jjanes,可以在这里找到不同语言的示例peachpayments.docs.oppwa.com/tutorials/webhooks/… 我的感觉是Scala 示例很有帮助,因为它还将auth_tag 附加到加密的正文中。希望这可以澄清。

标签: postgresql encryption aes-gcm pgcrypto


【解决方案1】:

pgcrypto 只说它支持 cbc 和 ecb。我不是密码学家,但我认为这两者都与 GCM 不同。所以我认为你不能用 pgcrypto 做到这一点。我不知道为什么它会导致你得到的确切错误,但它也并不让我感到惊讶。

如果我真的需要在数据库中执行此操作,我想我可以通过使用pl/python3u 编写一个函数来完成。

【讨论】:

  • 感谢@jjanes,这是有道理的,我希望 GCM 是 CBC/EBC 的变体。我想我们只会在数据库之外进行解密。谢谢,克里斯
猜你喜欢
  • 1970-01-01
  • 2021-06-04
  • 2019-02-27
  • 1970-01-01
  • 2021-09-23
  • 2017-09-18
  • 2021-09-03
  • 2020-07-03
  • 2018-04-29
相关资源
最近更新 更多