Postgresql 有没有办法在Postgres中验证签名摘要?

Postgresql 有没有办法在Postgres中验证签名摘要?,postgresql,public-key-encryption,sign,pgcrypto,Postgresql,Public Key Encryption,Sign,Pgcrypto,运行以下命令,并将content_文件、signature_文件和id_rsa.pub(或pem)的内容插入Postgres数据库 openssl dgst-签名id\u rsa内容文件>签名文件 有没有办法验证签名是否与Postgres中的内容/公钥相对应 我已经看过了函数,但是唯一相关的函数似乎是pgp_pub_decrypt,它需要密钥 基本上,我希望在博士后中完成以下工作: openssldgst-verify.\id\u rsa.pem-signature.\signature\u f

运行以下命令,并将content_文件、signature_文件和id_rsa.pub(或pem)的内容插入Postgres数据库

openssl dgst-签名id\u rsa内容文件>签名文件

有没有办法验证签名是否与Postgres中的内容/公钥相对应

我已经看过了函数,但是唯一相关的函数似乎是pgp_pub_decrypt,它需要密钥

基本上,我希望在博士后中完成以下工作:


openssldgst-verify.\id\u rsa.pem-signature.\signature\u file.\content\u file

根据克雷格的建议,我最终使用了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

根据克雷格的建议,我最终使用了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

pgcrypto支持OpenPGP消息的摘要验证,但我不确定它是否提供了一个简单的rsa摘要验证器。从
plpythonu
plperlu
或其他什么加载库?还是将适当的OpenSSL调用封装在C扩展中?@CraigRinger我对使用不受信任的库犹豫不决。C扩展是一个选项,尽管每个版本都有编译它的开销。如果我使用的是gpg--sign而不是openssl dgst-sign,pgcrypto会提供我想要的功能吗?我想是的,但我看不到它的任何功能。也许您可以对其进行修补,以添加验证支持,并向core提交修补程序,以备将来使用。至于“untrusted”,这仅仅意味着它们可以做任何事情,比如C扩展,所以您必须小心编写,非超级用户无法使用它们编写任意代码。就像C扩展一样,但不需要在每个版本中重新编译。在这种情况下,我可能会将plperlu或plpythonu作为我的第一站。pgcrypto支持OpenPGP消息的摘要验证,但我不确定它是否提供了简单的rsa摘要验证程序。从
plpythonu
plperlu
或其他什么加载库?还是将适当的OpenSSL调用封装在C扩展中?@CraigRinger我对使用不受信任的库犹豫不决。C扩展是一个选项,尽管每个版本都有编译它的开销。如果我使用的是gpg--sign而不是openssl dgst-sign,pgcrypto会提供我想要的功能吗?我想是的,但我看不到它的任何功能。也许您可以对其进行修补,以添加验证支持,并向core提交修补程序,以备将来使用。至于“untrusted”,这仅仅意味着它们可以做任何事情,比如C扩展,所以您必须小心编写,非超级用户无法使用它们编写任意代码。就像C扩展一样,但不需要在每个版本中重新编译。在这种情况下,我可能会让普帕鲁或普皮图努成为我的第一站。