2012-07-29 140 views
2

我一直在使用Postgresql 8.4通过pgcrypto进行数据加密时遇到了一些问题。pgcrypto Postgresql PGP pgp_pub_decrypt与密码

第一种情况:正常工作:

选择pgp_pub_decrypt(pgp_pub_encrypt( '的fsck', dearmor(PUBKEY), '压缩-ALGO = 1, 密ALGO = AES256'),dearmor(seckey ))从keytbl其中keytbl.id = 1

- >返回 “的fsck”

键1是PGP没有密码

第二种情况:不工作

选择pgp_pub_decrypt(pgp_pub_encrypt( '的fsck', dearmor(PUBKEY), '压缩-ALGO = 1, 密ALGO = AES256'),dearmor(seckey),从keytbl '密码'),其中 keytbl.id = 2

- >返回ERREUR:损坏数据

当我生成与密码键 pgcrypto不希望解密用加密后的消息公钥......

任何人都有猜测?这让我疯狂......

回答

1

这似乎是一个已知的bug,至少在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 *; 
$$; 

注意,发送到服务器私钥不得密码encryted。我们实际上可能会在服务器或中间件上生成它以避免问题。这可以避免你正在经历的错误。