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

问题描述:

运行以下命令,并将content_file,signature_file和id_rsa.pub(或pem)的内容插入到Postgres数据库中。有没有办法在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

+0

pgcrypto支持消化验证与OpenPGP的消息,但我不知道它提供了一个简单的RSA摘要验证。从'plpythonu'或'plperlu'加载一个库或其他东西?或者用C扩展包装适当的OpenSSL调用? –

+0

@CraigRinger我对使用不受信任的库犹豫不决。 C扩展是一个选项,尽管每个发行版都会编译它的开销。如果我使用gpg --sign而不是openssl dgst -sign,pgcrypto会提供我正在寻找的功能吗? – jzacharuk

+0

我认为是这样,但我没有看到它的任何功能。也许你可以修补它来添加验证支持,并为未来的版本提交核心修补程序。至于“不可信”这只意味着他们可以做任何事情,比如C扩展,所以你必须小心你写的东西,并且它们不适合非超级用户编写任意代码。就像C扩展一样,但是没有重新编译每个版本。在这种情况下,我可能会让plperlu或plpythonu成为我的第一站。 –

按照克雷格的建议,我结束了使用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包(泊坞环境在我的情况)。下面是从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