【问题标题】:Is there a way to verify a signed digest within Postgres?有没有办法在 Postgres 中验证签名摘要?
【发布时间】:2017-06-07 16:32:03
【问题描述】:

运行以下命令,并将 content_file、signature_file 和 id_rsa.pub(或 pem)的内容插入 Postgres 数据库。

openssl dgst -sign id_rsa content_file > signature_file

有什么方法可以验证签名是否与 Postgres 中的内容/公钥相对应?

我查看了 pgcrypto 函数,但唯一相关的函数似乎是需要密钥的 pgp_pub_decrypt。

基本上我希望在 Postgres 中执行以下操作:

openssl dgst -verify .\id_rsa.pem -signature .\signature_file .\content_file

【问题讨论】:

  • pgcrypto 支持使用 OpenPGP 消息进行摘要验证,但我不确定它是否提供简单的 rsa 摘要验证器。从plpythonuplperlu 加载库或其他什么?或者将适当的 OpenSSL 调用包装在 C 扩展中?
  • @CraigRinger 我对使用不受信任的库犹豫不决。 C 扩展是一个选项,尽管每个版本都需要编译它。如果我使用 gpg --sign 而不是 openssl dgst -sign,pgcrypto 会提供我正在寻找的功能吗?
  • 我是这么认为的,但我没有看到它的任何功能。也许您可以修补它以添加验证支持并为将来的版本提交一个补丁到核心。至于“不受信任”,这意味着它们可以做任何事情,比如 C 扩展,所以你必须小心你写的东西,非超级用户不能在其中编写任意代码。就像 C 扩展一样,但没有每个版本都重新编译。在这种情况下,我可能会让 plperlu 或 plpythonu 成为我的第一站。

标签: postgresql public-key-encryption sign pgcrypto


【解决方案1】:

根据 Craig 的建议,我最终使用 plpythonu 来解决这个问题。

CREATE OR REPLACE FUNCTION api.verify(
  p_data text,
  p_signature text,
  p_publickey text
)
  RETURNS boolean AS
$$
   try:
     import rsa

     pubkey = rsa.PublicKey.load_pkcs1(p_publickey)
     signature = bytearray.fromhex(p_signature)
     verified = rsa.verify(p_data, signature, pubkey)

     return verified
   except:
     return False

$$ LANGUAGE plpythonu VOLATILE
  SECURITY DEFINER;

由于我缺乏 python 知识,这其中最困难的部分实际上是设置所需的 python 包(在我的例子中是 Docker 环境)。以下是 Dockerfile 的相关摘录:

FROM postgres:9.6

# Install necessary python packages to work with postgres
RUN apt-get update \
 && apt-get install -y --no-install-recommends \
    "postgresql-plpython-$PG_MAJOR" \
 && apt-get install -y python-pip python-dev

# Install python rsa module for signature verification
RUN pip install rsa

在给定以下参数的情况下,该函数起作用:

-- Generate private key. Provide secure passphrase when prompted.
openssl genrsa -aes256 -out private.pem 4096

--Export public KEY
openssl rsa -in private.pem -RSAPublicKey_out -out public.pem

--Sign data. Provide secure passphrase when prompted.
--Remove first line (RSA-SHA256(data.txt)=) when passing into database verify function.
openssl dgst -hex -sign private.pem data.txt > signature.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多