2

我在使用 Postgresql 8.4 的 pgcrypto 上进行数据加密时遇到了一些问题。

第一种情况:工作正常:

从 keytbl 中选择 pgp_pub_decrypt(pgp_pub_encrypt('fsck',dearmor(pubkey),'compress-algo=1,cipher-algo=aes256'),dearmor(seckey)),其中 keytbl.id=1

-> 返回“fsck”

密钥 1 是没有密码的 pgp

第二种情况:不起作用

从 keytbl 中选择 pgp_pub_decrypt(pgp_pub_encrypt('fsck',dearmor(pubkey),'compress-algo=1, cipher-algo=aes256'),dearmor(seckey),'password'),其中 keytbl.id=2

-> 返回 ERREUR:损坏的数据

当我使用密码生成密钥时, pgcrypto 不想解密用公钥加密的消息....

有人猜到了吗?这让我发疯...

4

1 回答 1

1

这似乎是至少 8.4 和 9.0 中的一个已知错误。过去我通过避免使用密码短语功能以及使用pgp_sym_encryptpgp_sym_decrypt管理密钥的密码短语来避免这种情况。

一般来说,如果这给您带来了问题,您最好的选择是使用经过充分测试的功能分别使用密码对密钥进行加密。

为了让您了解我们是如何做到的:

create or replace function user__replace_keys
(in_public_key bytea, in_private_key bytea, in_passphrase text)
RETURNS user_key
LANGUAGE SQL AS
$$
UPDATE user_key
   SET last_resort_key = pgp_pub_encrypt(
                             pgp_pub_decrypt(
                                   last_resort_key,
                                   pgp_sym_decrypt_bytea(priv_key, $3)
                             ), $2
                         ),
       pub_key = $2,
       priv_key = pgp_sym_encrypt_bytea($2, $3)
 WHERE login = SESSION_USER
RETURNING *;
$$;

请注意,发送到服务器的私钥不得进行密码加密。我们实际上可能会在服务器或中间件中生成它以避免出现问题。这样可以避免您遇到的那种错误。

于 2013-04-06T10:37:50.040 回答