如何使用“gpg”命令行解密最初使用“pgp_pub_encrypt”加密的数据?

问题描述 投票:0回答:1

出于某种原因,我的数据最初是使用 PostgreSQL 中的

pgp_pub_encrypt
函数加密的,使用我拥有的公钥/私钥,如下所示:

INSERT INTO testtable(testdata)
VALUES(pgp_pub_encrypt('random string', dearmor(
'-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBGahWCYBEADk3B3HsMtpNrQC0JGbcrV9BrYuYZPiOjq0Z+NgQRJMz2Z6pRsj
...
-----END PGP PUBLIC KEY BLOCK-----')));

我可以用 Postgres 中的密钥解密它:

SELECT pgp_pub_decrypt(cc, dearmor(
'-----BEGIN PGP PRIVATE KEY BLOCK-----

lQcYBGah2323YB2323D23blablalbalblblaetc...
...
-----END PGP PRIVATE KEY BLOCK-----'
), 'testdata') AS testdata FROM testtable;

但我需要做的是从 Postgres 导出数据并用

gpg
解密。我怎样才能做到这一点?

我尝试了几种迭代和导出为文本和数据的格式,例如:

COPY (SELECT testdata FROM testtable) TO '/Users/jonathanbuys/Desktop/encrypted_data.dat' WITH (FORMAT BINARY);

并用 gpg 标头包装导出,但到目前为止还没有运气。

非常感谢任何正确方向的指点。

postgresql encryption gnupg
1个回答
0
投票

COPY BINARY 格式针对相同版本和架构的 PostgreSQL 服务器之间的高效使用进行了优化,而不是为了最大程度的互操作性。所以这与你想要的相反。

您可以使用其中一种文本格式(CSV或TEXT)来发送armor()函数的输出,但这仍然会导致一些字符(据我所知,仅限换行符)被引用或逃脱,你必须处理。

因此,我不使用盔甲,而是使用encode(.,'hex') 将存储的二进制文件转义为我们知道没有这些特殊字符的格式。 基于 this 答案,给出了以下 psql 元命令:

\COPY (SELECT encode(testdata,'hex') FROM testtable) TO program 'xxd -p -r|gpg -d -q > decrypted'

这取决于测试表只有一行,或者取决于您向查询添加 WHERE 子句,因此它只输出一行。

当然,您还可以通过其他方式将其拼凑在一起,使用中间文件而不是管道,或者使用 base64 而不是十六进制。如果有足够的服务器权限,您可以使用 COPY 而不是 \COPY。

© www.soinside.com 2019 - 2024. All rights reserved.