O melhor maneira é fazer a criptografia no cliente ou servidor de aplicativos, para que o banco de dados não tenha ideia de quais sejam as chaves e não possa descriptografar os dados. Se o cliente/appserver estiver em um host diferente, melhor ainda.
Se o seu banco de dados estiver criptografando e descriptografando os dados para você, ele estará vulnerável ao roubo das chaves junto com o banco de dados.
Se você usar as funções de criptografia no banco de dados do pgcrypto, poderá fazer com que o aplicativo envie a chave junto com os dados, o que é pelo menos um pouco útil. Ainda corre o risco de ter as chaves expostas nos logs se um administrador de sistema útil ativar o log de declaração agressivo ou o despejo automático de plano, e no final, se as chaves estiverem indo para a máquina do banco de dados, elas estarão mais vulneráveis do que se não estiverem. . Um invasor que assume o controle da máquina do banco de dados também pode alterar as configurações de log, substituir os binários do postgresql ou farejar o tráfego para capturar chaves e dados dessa maneira.
Se o appserver e o db estiverem na mesma máquina e gerenciados pela(s) mesma(s) função(ões), há menos sentido em se preocupar em isolá-los, e pode ser sensato usar apenas pgcrypto.
De qualquer forma, lembre-se de salgar!