Кэширование незашифрованных паролей в памяти сервиса WCF - PullRequest
2 голосов
/ 24 марта 2010

На первый взгляд это звучит ужасно, но вот мой сценарий: у меня есть служба Windows, которая предоставляет несколько конечных точек WCF с использованием аутентификации по имени пользователя. Пользовательский аутентификатор будет либо искать учетные данные пользователя в локальной базе данных (пароль хранится в виде соленого SHA-1), либо он отправит WCF-запрос другой службе для проверки пароля. (Существует объект enum для объекта User, который может быть внутренним или внешним, указывая, какой источник аутентификации использовать).

Я обнаружил, что выполнение проверки поиска + хэша или вызова WCF обходится дорого при каждом отдельном запросе к моей службе, поэтому я хотел бы кэшировать информацию об имени пользователя / пароле. Каждый элемент в кэше будет иметь время жизни, поэтому, например, если элемент в кэше имеет возраст 60 секунд, при следующем запросе аутентификатор проверяет учетные данные по исходному источнику вместо кэша, а затем обновляет его.

Для локальной базы данных я мог бы просто сохранить пару имя пользователя / SHA1 в словаре, и при каждом запросе от «внутреннего» пользователя мне просто нужно было бы повторно хешировать предоставленный пароль и сравнить его. Для «внешнего» пользователя мне нужно было бы предоставить аутентификатору только незашифрованный пароль, поэтому я должен был бы его хешировать и сохранить как часть кеша. Хотя это, безусловно, избавляет меня от накладных расходов, связанных с запросом к базе данных или вызовом удаленной службы, мне все равно приходится каждый раз выполнять операцию хеширования.

Данная служба будет работать на внутреннем сервере с хорошей физической и сетевой безопасностью. Является ли приемлемой практика хранить открытый пароль в кеше вместо хранения хешированной версии? В этом случае мой риск, похоже, заключается в том, что злоумышленник сбрасывает память процесса и получает пароли. Если я считаю такой риск приемлемым, есть ли какая-то другая причина, по которой мне следует избегать хранения паролей в виде открытого текста в памяти?

Если я решу использовать незашифрованные пароли, я думаю, что SecureString может ограничить мой риск до некоторой степени. Стоит ли беспокоиться о том, чтобы использовать SecureString (реализация кажется очень обходной)? Я хорошо осведомлен о риске постоянного хранения паролей без хеширования, однако я не уверен, что, по-видимому, существует консенсус относительно нестабильного хранения паролей в виде открытого текста.

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

SecureString использует зашифрованную память, так что это, вероятно, повысит производительность по сравнению с хешированием самостоятельно каждый раз. Но вам придется профилировать его в своей среде.

Что касается риска хранения простых паролей в памяти, это не тот вопрос, на который можно ответить в этом контексте. Я мог бы просто сказать, да, все в порядке. Потому что это для моей ситуации по разным причинам. Но это не будет так же, как у вас.

Вот что я предлагаю: Рассмотрим последствия утечки паролей - в основном, сколько будет стоить ($ или $$$?) Хакеру обладать паролем? Большинство проблем безопасности в наши дни происходят из-за финансовых стимулов. Условно говоря, эти парни превосходят чистый вандализм.

Теперь сравните это с возможностью того, что безопасность может быть скомпрометирована совершенно другим способом, то есть SQL-инъекцией или телефонным звонком пользователя для «проверки его учетной записи». Если значение пары паролей в $ велико и другого способа их получения нет, то, возможно, вам следует продолжать их шифровать (и теперь вы оправдали стоимость более мощного сервера!). И затем убедитесь, что вы защитили ключи шифрования - как только хакер получит ваш сервер, к этим ключам, вероятно, так же легко получить доступ, как и к памяти программы.

С другой стороны, если значение низкое и есть другие возможные эксплойты, которые легко доступны (и часто есть), вы можете привести разумный аргумент, что хакеру не стоит тратить время на взлом сервера и сброс дампа. память.

Удачи.

1 голос
/ 24 марта 2010

Данная служба будет работать на внутреннем сервере с хорошей физической и сетевой безопасностью.

Пока это верно с настоящего момента и до вечности (или следующего патча, который когда-либо будет первым), сохраняющего кэшированный пароль в ram как обычный текст - это нормально. Если вы храните всю базу данных паролей в оперативной памяти (скажем, ваше постоянное хранилище слишком медленное), я думаю, что было бы лучше хранить их как безопасные строки, но, поскольку вы храните только несколько паролей не более 1 минуты, я не вижу проблем.

...