Добавление пользовательского hashAlgorithmType в C # ASP.NET - PullRequest
3 голосов
/ 24 июня 2011

У меня есть страница, на которой мне нужно повысить безопасность.Я использую встроенную функциональность MembershipProvider и в настоящее время hashAlgorithmType установлен на SHA512.У меня есть библиотека BCrypt.NET (http://bcrypt.codeplex.com/)), и, кажется, она хорошо работает, когда я вызываю ее функции из кода, но у меня самое плохое время, чтобы выяснить, как создать соответствующий раздел <cryptographySettings> в Web.config.чтобы позволить мне создать hashAlgorithmType.

Я нашел следующий фрагмент кода в Интернете:

<mscorlib>
    <cryptographySettings>
        <cryptoNameMapping>
            <cryptoClasses>
                <cryptoClass   MyHash="MyHashClass, MyAssembly
              Culture=neutral, PublicKeyToken=a5d015c7d5a0b012,
              Version=1.0.0.0"/>
                <cryptoClass   MyCrypto="MyCryptoClass, MyAssembly
              Culture=neutral, PublicKeyToken=a5d015c7d5a0b012,
              Version=1.0.0.0"/>
            </cryptoClasses>
            <nameEntry name="System.Security.Cryptography.HashAlgorithm"
                       class="MyHash"/>
        </cryptoNameMapping>
        <oidMap>
            <oidEntry OID="1.3.36.3.2.1"   name="MyCryptoClass"/>
        </oidMap>
    </cryptographySettings>
</mscorlib>

Если хотите, назовите меня нубом, но у меня явно нетНеобходимые знания, чтобы понять это, и все, что мне нужно, - это метод, позволяющий сообщить провайдеру членства, что что-то вроде <hashAlgorithmType="bcrypt"> соответствует чему-то вроде string hashed = BCrypt.HashPassword(password, BCrypt.GenerateSalt(12)); для шифрования и bool matches = BCrypt.CheckPassword(candidate, hashed); для расшифровки. Скажите, пожалуйста, есть простой ответЯ могу переписать систему входа в систему с нуля, если потребуется, но у меня уже есть работающая реализация, которую я действительно хотел бы просто изменить алгоритм хеширования.

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

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

Вы можете программно зарегистрировать примитивы шифрования BCrypt с классом CryptoConfig с помощью вызова AddAlgorithm с именем, которое вы можете позже использовать.

Пока поставщик хеша BCrypt реализует HashAlgorithn, вы должны иметь возможность просто зарегистрировать его, вы также можете проверить это, вызвав HashAlgorithm.Create(string) с именем, которое вы используете, чтобы убедиться, что он правильно строит алгоритм.

Поставщик членства должен иметь возможность использовать его без проблем. Вот хорошая статья на эту тему.

Обновление

(глубокий вдох) - извинения, если это tl; др.

Хорошо, так что прочитав о хешировании паролей в BCrypt.Net - это, очевидно, хорошо и следует принятой практике. Кроме того, он полностью несовместим с тем, как работает класс HashAlgorithm, поскольку для его работы требуется дополнительное состояние, и его нельзя просто расширить для реализации контракта HashAlgorithm.

Таким образом, у вас есть выбор - придерживайтесь MembershipProvider и используйте SHA512, как вы уже сейчас - вы говорите о повышении безопасности на странице , поэтому я думаю, что могут быть проблемы с самой аутентификацией, а не с хранением паролей (что, конечно, все же должно быть сделано должным образом) - поэтому попробуйте просто убедиться, что трафик аутентификации отправляется через HTTPS, если это еще не сделано.

Использование алгоритмов растяжения паролей вслепую имеет свои собственные проблемы - см. Ответы на моего собственного недавнего SO на эту тему - если вы выполняете растягивание на сервере, вы можете в конечном итоге вызвать DOS-атаку на сайт!

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

Мои сайты теперь используют алгоритм, очень похожий на PBKDF2, который я взял из книги Брюса Шнайера и Нильса Фергюсона «Практическая криптография», для которой я использую 512-битную случайную соль и SHA512 (хранилище дешево), а также многие тысячи итераций для хеширования ясности текст. Сервер тестирует себя один раз для каждого домена приложения, чтобы установить «уровни» защиты, равные диапазонам в миллисекунды - таким образом, со временем вновь хешированные пароли получат постоянный уровень защиты, даже если оборудование улучшится. Библиотека также является автономной, и я смог развернуть ее на SQL Server 2008 R2, чтобы предоставить SP CLR, если нам нужно будет создавать записи паролей на уровне SQL.

Но это защищает только пароли - тогда вам нужен механизм аутентификации, который может защитить сам процесс входа в систему; плюс еще одна система для защиты аутентифицированного токена сеанса (система cookie аутентификации .Net на самом деле очень хороша для этого).

Исходя из этого, я потратил неделю на реализацию SCRAM примитивов, которые я затем подключил к своим веб-сервисам MVC для аутентификации, и я планирую сделать то же самое, чтобы разрешить вход в систему из веб-браузера. используя Javascript (блокировка не-JS клиентов). Ключ в том, что клиент делает все вычисления хеша; таким образом, я придерживался SHA, потому что зрелые реализации легко доступны практически в любой среде (например, у нас есть приложения для iPhone - и они также должны проходить аутентификацию).

Однако в вашем случае, учитывая существующие инвестиции в MembershipProvider, я бы посчитал достаточным 512 бит SHA плюс SSL плюс cookie-файл аутентификации Asp.Net, если база данных действительно безопасный (!) И у вас нет дыр для SQL-инъекций на сайте.

1 голос
/ 12 июля 2011

Для реализации BCrypt HashAlgorithm см. Мой ответ на аналогичный вопрос здесь .

Вам потребуется создать подписанную сборку с примером кода в моем ответе, а затем изменитьваши настройки по мере необходимости:

<cryptoNameMapping>
  <cryptoClasses>
    <cryptoClass MyHash="BCryptHasher, MySignedAssemblyName
                 Culture=neutral, PublicKeyToken=<my public key for singed assembly>,
                 Version=1.0.0.0"/>
  </cryptoClasses>
  <nameEntry name="System.Security.Cryptography.HashAlgorithm" class="MyHash"/>
</cryptoNameMapping>
0 голосов
/ 24 июня 2011

Чтобы иметь возможность зарегистрировать пользовательский hashAlgorythmType, первое, что вам нужно, это тип, который на самом деле реализует HashAlgorythm . Если BCrypt реализует его, это ваш счастливый день, но, очевидно, он НЕ реализует его, так что это ваша проблема.

На самом деле обходного пути нет, так как реализация HashAlgorithm является обязательным условием для такой регистрации.

Итак, вам нужно либо написать обертку вокруг BCrypt для реализации HashAlgorithm, либо, из-за этого невозможно, изменить сам BCrypt для ее реализации.

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

...