Замок ActiveRecord / NHibernate - шифрование пароля или хеширование - PullRequest
0 голосов
/ 26 января 2009

Как правильно работать с паролями, которые вы не хотите хранить в виде открытого текста в базе данных? Какие у меня варианты в NHibernate / Castle ActiveRecord?

UPDATE: Мне было интересно, как другие справляются с этим с помощью NHibernate / Castle ActiveRecord. И если что-то было встроено в NHibernate или Castle ActiveRecord.

Ответы [ 5 ]

7 голосов
/ 27 января 2009

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

Когда пользователь первоначально выбирает свой пароль, вы запускаете однонаправленный алгоритм хеширования для текста. Это создает сигнатуру - вывод, который всегда будет производиться, если вы введете одну и ту же строку в алгоритм хеширования. Ключ в том, что вы не можете вернуться к паролю из хэша (следовательно, одностороннего). Затем вы сохраняете хеш, а не пароль. Когда пользователь возвращается, он должен снова ввести свой пароль, вы хэшируете его, используя тот же алгоритм, и сравниваете полученное значение с тем, что находится в БД - если они совпадают, вы знаете, что пользователь снова ввел ту же строку, но вы все равно не не знаю, или нужно знать, что это такое. Это гораздо более безопасно, чем решения, основанные на шифровании, где вы всегда можете восстановить открытый текст, если знаете ключ, который по определению должен быть известен серверу для проверки правильности ввода пароля.

Простой способ хэширования строки в .NET заключается в использовании System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(), который, несмотря на его длинное имя, является простой функцией, предназначенной для тех, кто использует проверку подлинности на основе форм ASP.NET, но такой же полезной в других местах. Вы можете указать MD5 или SHA1 в качестве своего алгоритма хеширования (или даже других алгоритмов хеширования, если они будут поддерживаться будущими версиями платформы). Я рекомендую SHA1, поскольку известно, что у MD5 есть слабые стороны, но, вероятно, и у SHA1 тоже есть.

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

Что вы должны сделать, это соль хеш. Это просто означает добавление или добавление исходных данных - пароля - к произвольной строке символов. Эта соль должна быть как можно более случайной и иметь длину не менее нескольких символов (я рекомендую минимум 5) и предпочтительно произвольной длины. Вы сохраняете соль (необъясненную) в столбце в БД вместе с хешированной комбинацией соль + пароль. Когда пользователь возвращает, вы добавляете или добавляете соль к его вводу таким же образом, а затем выполняете сравнение хешей, как и раньше.

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

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

2 голосов
/ 26 января 2009

Лучший способ - использовать UserType. Вот один , который реализует прозрачное шифрование пароля.

Я скопирую подобные вопросы в ActiveRecord wiki .

1 голос
/ 16 апреля 2010

Я бы предложил не использовать UserType для одностороннего хэширования, если только у вас нет плана, который будет препятствовать постоянной перефразировке хешированного пароля при последующих вызовах NullSafeSet ().

Вместо этого я бы порекомендовал вам использовать поле поддержки в свойстве Password, применить метод хэширования в установщике и настроить отображение для использования доступа к полю.

0 голосов
/ 16 сентября 2010

извините, может быть, это больше не важно для вас, но я надеюсь, что может помочь кому-то еще.

Использование uNhAddins - самый простой способ, который я обнаружил, вам нужно заботиться только о HBM, вот и все.

проверьте это hbm пример

Надеюсь, что помощь

0 голосов
/ 26 января 2009

Вы должны либо зашифровать, либо хэшировать пароль. Хеширование немного более безопасно (в зависимости от алгоритма, конечно). Потому что это не может быть обращено вспять; однако шифрование может быть более функциональным, поскольку у вас может быть опция восстановления пароля. При хешировании вы должны сгенерировать новый пароль ..

Что касается nHibernate / castle, вы должны работать с алгоритмом внутри ваших бизнес-объектов, ИМХО, отделенным от механизма персистентности.

...