O armazenamento secreto é um problema comum ao usar mecanismos de criptografia.
O pgcrypto não fornece armazenamento de chave, você é livre para armazenar a chave onde quiser e protegê-la como puder.
Armazenar a chave em outro banco de dados, se gerenciada pelo mesmo DBA, não oferece muita segurança, pois o DBA pode acessá-la da mesma maneira.
Idealmente, você armazenaria a chave em um cofre seguro e a solicitaria de seu aplicativo para construir as consultas. Ele ainda estará visível do DBA enquanto a solicitação estiver sendo executada através de
select * from pg_stat_activity
. Você pode definir a chave para uso em toda a sessão SQL através de
set session my.vars.cryptokey = 'secret';
em seguida, use-o em suas consultas com a seguinte sintaxe:current_setting('my.vars.cryptokey')::text
Para ser (quase) transparente do ponto de vista da aplicação, as regras do PostgreSQL podem ajudar na tradução de
secure_column
para a chamada para descriptografar a função com a chave armazenada na sessão. Para inserir, seria necessário um gatilho de pré-inserção.