(Забележка:Не съм експерт по сигурността. Имам интерес в областта, но това е всичко. Имайте го предвид.)
Ако е възможно, изобщо не съхранявайте пароли
Зависи много от нуждите ви. Най-добрият вариант от всички е изобщо да не използвате двупосочно криптиране; ако можете да съхранявате само salted и еднопосочен хеширан обобщения на пароли, което е идеално. Все още можете да ги тествате, за да видите дали съвпадат с дадена парола от потребителя, но никога не я съхранявате.
Още по-добре, ако вашите клиенти използват някакъв нормален протокол (т.е. не HTTP, както обикновено се прилага), можете да използвате механизъм за удостоверяване на предизвикателство-отговор това означава, че вашето приложение никога никога трябва да види паролата на потребителя, дори когато го удостоверява. За съжаление това рядко е възможно в публичната мрежа, която има сигурност, която би засрамила програмистите от 80-те години.
Ако трябва да съхраните паролата, изолирайте ключовете от приложението
Ако трябва да можете да дешифрирате паролите, в идеалния случай не трябва да разполагате с всички подробности за това на едно място и със сигурност не на едно лесно достъпно място, което може да се копира.
Поради тази причина аз лично бих предпочел да не използвам PgCrypto (както правите вие) за тази цел, защото ви принуждава да разкриете частния ключ и (ако има такъв) паролата на сървъра, където може да бъде изложен в PostgreSQL регистрационни файлове или по друг начин потенциално подушени. Бих искал да направя моята крипто клиентска страна, където мога да използвам PKCS#11, ключов агент или други инструменти, които ми позволяват да декриптирам данните, без моят код да има достъп до ключа.
Проблемът със защитеното съхранение на ключове е част от това, което PKCS#11 е изобретен за. Той предоставя общ интерфейс за приложения и доставчици на криптовалута за комуникация с всичко, което може да предостави определени услуги за подписване и дешифриране, без изобщо да разкрива своя ключ . Обичайната, но не само, употреба е с хардуерно базирано крипто като смарт карти и хардуерни крипто модули. На такива устройства може да се каже да подписват или дешифрират данни, предадени им, и могат да го направят, без изобщо да разкриват ключа. Ако е възможно, обмислете използването на смарткарта или HSM. Доколкото знам, PgCrypto не може да използва PKCS#11 или други HSM/смарт карти.
Ако не можете да направите това, пак вероятно можете да използвате агент за управление на ключове, където зареждате ключа си в програма за управление на ключове ръчно, когато сървърът се стартира, и програмата за управление на ключове предоставя PKCS#11 (или някакъв друг) интерфейс за подписване и дешифриране чрез сокет. По този начин вашето уеб приложение изобщо не трябва да знае ключа. gpg-agent
може да се класира за тази цел. Отново, доколкото знам, PgCrypto не може да използва агент за управление на ключове, въпреки че би било чудесно да се добави.
Дори малко подобрение може да помогне. Най-добре е паролата за вашия ключ да не се съхранява на диска, така че може да поискате тя да бъде въведена при стартиране на приложението, за да може ключът да бъде дешифриран. Вие все още съхранявате декриптирания ключ в паметта, но всички подробности за декриптирането му вече не са на диска и лесни за достъп. За нападателя е много по-трудно да открадне дешифрирания ключ от паметта, отколкото да вземе "password.txt" от диска.
Това, което изберете да направите, зависи до голяма степен от детайлите на вашите нужди за сигурност и данните, с които работите. На ваше място просто не бих съхранявал паролите, ако изобщо е възможно, и ако трябваше, бих искал да използвам хардуерно устройство, съвместимо с PKCS#11.