(Nota:non sono un esperto di sicurezza. Ho un interesse per l'area, ma questo è tutto. Tienilo a mente.)
Se possibile, non memorizzare affatto le password
Dipende molto da quali sono le tue esigenze. L'opzione migliore in assoluto è non utilizzare affatto la crittografia a due vie; se puoi memorizzare solo salato e hash unidirezionale password digest che è l'ideale. Puoi comunque testarli per vedere se corrispondono a una password fornita dall'utente, ma non la memorizzi mai.
Meglio ancora, se i tuoi clienti usano un protocollo sano (es:non HTTP come comunemente implementato) puoi usare un meccanismo di autenticazione challenge-response ciò significa che la tua app non mai deve vedere la password dell'utente, nemmeno durante l'autenticazione. Purtroppo questo è raramente possibile sul Web pubblico, che dispone di una sicurezza tale da far vergognare i programmatori degli anni '80.
Se devi memorizzare la password, isola le chiavi dall'app
Se devi essere in grado di decifrare le password, idealmente non dovresti avere tutti i dettagli per farlo in un unico posto, e certamente non in un posto copiabile e facilmente accessibile.
Per questo motivo personalmente preferirei non usare PgCrypto (come stai facendo tu) per questo scopo perché ti costringe a rivelare la chiave privata e (se ne ha una) passphrase al server, dove potrebbe essere esposto in PostgreSQL's log o altrimenti potenzialmente sniffati. Vorrei fare la mia crittografia lato client, dove potrei usare PKCS#11, un agente chiave o altri strumenti che mi consentono di decrittografare i dati senza che il mio codice sia in grado di accedere alla chiave.
Il problema dell'archiviazione sicura delle chiavi fa parte di ciò che PKCS#11 è stato inventato per. Fornisce un'interfaccia generica per applicazioni e provider di crittografia per comunicare con qualsiasi cosa in grado di fornire determinati servizi di firma e decrittografia senza mai rivelare la sua chiave . Il solito, ma non solo, l'uso è con crittografia basata su hardware come smart card e moduli crittografici hardware. A tali dispositivi può essere detto di firmare o decrittografare i dati loro passati e possono farlo senza mai rivelare la chiave. Se possibile, considera l'utilizzo di una smartcard o HSM. Per quanto ne so, PgCrypto non può utilizzare PKCS#11 o altri HSM/smartcard.
Se non puoi farlo, probabilmente puoi comunque utilizzare un agente di gestione delle chiavi, in cui carichi manualmente la tua chiave in un programma di gestione delle chiavi all'avvio del server e il programma di gestione delle chiavi fornisce un'interfaccia PKCS#11 (o qualche altra) per la firma e la decrittazione tramite un socket. In questo modo la tua app web non ha mai bisogno di conoscere la chiave. gpg-agent
possono qualificarsi per questo scopo. Ancora una volta, per quanto ne so, PgCrypto non può utilizzare un agente di gestione delle chiavi, anche se sarebbe un'ottima funzionalità da aggiungere.
Anche un piccolo miglioramento può aiutare. È meglio se la passphrase per la tua chiave non è archiviata su disco, quindi potresti richiederne l'immissione all'avvio dell'app in modo che la chiave possa essere decrittografata. Stai ancora archiviando la chiave decrittografata in memoria, ma tutti i dettagli per decrittografarla non sono più su disco e sono facili da ottenere. È molto più difficile per un utente malintenzionato rubare la chiave decifrata dalla memoria piuttosto che prendere un "password.txt" dal disco.
Ciò che scegli di fare dipende molto dai dettagli delle tue esigenze di sicurezza e dai dati con cui stai lavorando. Al tuo posto, se possibile, non memorizzerei le password e, se necessario, vorrei utilizzare un dispositivo hardware compatibile con PKCS#11.