2012-07-29 57 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。我們實際上可能會在服務器或中間件上生成它以避免問題。這可以避免你正在經歷的錯誤。