有没有办法在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
答
按照克雷格的建议,我结束了使用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
pgcrypto支持消化验证与OpenPGP的消息,但我不知道它提供了一个简单的RSA摘要验证。从'plpythonu'或'plperlu'加载一个库或其他东西?或者用C扩展包装适当的OpenSSL调用? –
@CraigRinger我对使用不受信任的库犹豫不决。 C扩展是一个选项,尽管每个发行版都会编译它的开销。如果我使用gpg --sign而不是openssl dgst -sign,pgcrypto会提供我正在寻找的功能吗? – jzacharuk
我认为是这样,但我没有看到它的任何功能。也许你可以修补它来添加验证支持,并为未来的版本提交核心修补程序。至于“不可信”这只意味着他们可以做任何事情,比如C扩展,所以你必须小心你写的东西,并且它们不适合非超级用户编写任意代码。就像C扩展一样,但是没有重新编译每个版本。在这种情况下,我可能会让plperlu或plpythonu成为我的第一站。 –