На первый взгляд это звучит ужасно, но вот мой сценарий: у меня есть служба Windows, которая предоставляет несколько конечных точек WCF с использованием аутентификации по имени пользователя. Пользовательский аутентификатор будет либо искать учетные данные пользователя в локальной базе данных (пароль хранится в виде соленого SHA-1), либо он отправит WCF-запрос другой службе для проверки пароля. (Существует объект enum для объекта User, который может быть внутренним или внешним, указывая, какой источник аутентификации использовать).
Я обнаружил, что выполнение проверки поиска + хэша или вызова WCF обходится дорого при каждом отдельном запросе к моей службе, поэтому я хотел бы кэшировать информацию об имени пользователя / пароле. Каждый элемент в кэше будет иметь время жизни, поэтому, например, если элемент в кэше имеет возраст 60 секунд, при следующем запросе аутентификатор проверяет учетные данные по исходному источнику вместо кэша, а затем обновляет его.
Для локальной базы данных я мог бы просто сохранить пару имя пользователя / SHA1 в словаре, и при каждом запросе от «внутреннего» пользователя мне просто нужно было бы повторно хешировать предоставленный пароль и сравнить его. Для «внешнего» пользователя мне нужно было бы предоставить аутентификатору только незашифрованный пароль, поэтому я должен был бы его хешировать и сохранить как часть кеша. Хотя это, безусловно, избавляет меня от накладных расходов, связанных с запросом к базе данных или вызовом удаленной службы, мне все равно приходится каждый раз выполнять операцию хеширования.
Данная служба будет работать на внутреннем сервере с хорошей физической и сетевой безопасностью. Является ли приемлемой практика хранить открытый пароль в кеше вместо хранения хешированной версии? В этом случае мой риск, похоже, заключается в том, что злоумышленник сбрасывает память процесса и получает пароли. Если я считаю такой риск приемлемым, есть ли какая-то другая причина, по которой мне следует избегать хранения паролей в виде открытого текста в памяти?
Если я решу использовать незашифрованные пароли, я думаю, что SecureString может ограничить мой риск до некоторой степени. Стоит ли беспокоиться о том, чтобы использовать SecureString (реализация кажется очень обходной)? Я хорошо осведомлен о риске постоянного хранения паролей без хеширования, однако я не уверен, что, по-видимому, существует консенсус относительно нестабильного хранения паролей в виде открытого текста.