出于某种原因,我的数据最初是使用 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 标头包装导出,但到目前为止还没有运气。
非常感谢任何正确方向的指点。
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。