2

Postgresql8.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です

2番目のケース:機能しない

select pgp_pub_decrypt(pgp_pub_encrypt('fsck'、dearmor(pubkey)、'compress-algo = 1、cipher-algo = aes256')、dearmor(seckey)、'password')from keytbl where keytbl.id = 2

-> ERREURを返します:破損したデータ

パスワードを使用してキーを生成すると、pgcryptoは公開キーで暗号化されたメッセージを復号化したくありません...。

誰かが推測しましたか?これは私を怒らせています...

4

1 に答える 1

1

これは、少なくとも 8.4 および 9.0 の既知のバグのようです。私はこれまで、パスフレーズ機能の使用を避け、キーのパスフレーズを使用pgp_sym_encryptして管理することで、これを回避してきました。pgp_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 に答える