English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Думаю, те, кто熟悉 MS Identity认证 системы, знают роль UserManager, он является координатором в системе, он определяет набор пользовательских действий, которые помогают нам управлять пользовательской информацией, информацией о ролях, обрабатывать пароли и т.д. Его реализация находится в UserStore, где мы можем реализовать его для нас определенный, например, IUserStore, IUserPasswordStore, IRoleStore и т.д. Мы можем на основе整套 пользовательских действий自定义 свои пользовательские данные и структуру данных, а также хранение данных. Что касается Password Hasher, MS предоставляет нам полный набор определений поведения, и его управление осуществляется UserManager. Например
UserManager.PasswordHasher.HashPassword(password)
PasswordHasher определен в интерфейсе UserManager следующим образом:
Меня изначально не интересовала его стандартная реализация, так как я需要一个 независимый проект для аутентификации пользователей для целей независимой аутентификации нескольких приложений, который производит токены, и после успешной аутентификации пользовательский HTTP Request Header Authorization содержит token для доступа к различным ресурсам на сервере приложения.
Вот почему в нескольких приложениях при проверке паролей出现了 такая проблема:
Например, приложение A использует реализацию IPasswordHasher для自定义ного способа шифрования - MD5 + salt, а приложение B использует стандартный PasswordHasher от Identity, и код, полученный после декомпиляции, следующий:
Так как для обеспечения совместимости с различными способами шифрования в различных приложениях, мне пришлось декомпилировать исходный код, получить его стандартный способ шифрования, на основе различных имен приложений, определить шифрование или дешифрование пароля, или напрямую сравнить пароль, введенный пользователем, с паролем в базе данных. Начнем с конкретного реализация MS стандартного PasswordHasher
// Декомпилирован с помощью JetBrains decompiler // Тип: Microsoft.AspNet.Identity.Crypto // Ассембли: Microsoft.AspNet.Identity.Core, Версия=2.0.0.0, Культура=нейтральная, PublicKeyToken=31bf3856ad364e35 // MVID: E3A10FFD-023A-4BC3-AD53-32D145ABF1C9 // Assembly location: C:\Sport\NewProject\V2.0\Api\Fantasy.Sport\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll using System; using System.Runtime.CompilerServices; using System.Security.Cryptography; namespace Microsoft.AspNet.Identity { internal static class Crypto { private const int PBKDF2IterCount = 1000; private const int PBKDF2SubkeyLength = 32; private const int SaltSize = 16; public static string HashPassword(string password) { if (password == null) throw new ArgumentNullException("password"); byte[] salt; byte[] bytes; using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, 16, 1000)) { salt = rfc2898DeriveBytes.Salt; bytes = rfc2898DeriveBytes.GetBytes(32); } byte[] inArray = new byte[49]; Buffer.BlockCopy((Array) salt, 0, (Array) inArray, 1, 16); Buffer.BlockCopy((Array) bytes, 0, (Array) inArray, 17, 32); return Convert.ToBase64String(inArray); } public static bool VerifyHashedPassword(string hashedPassword, string password) { if (hashedPassword == null) return false; if (password == null) throw new ArgumentNullException("password"); byte[] numArray = Convert.FromBase64String(hashedPassword); if (numArray.Length != 49 || (int) numArray[0] != 0) return false; byte[] salt = new byte[16]; Buffer.BlockCopy((Array) numArray, 1, (Array) salt, 0, 16); byte[] a = new byte[32]; Buffer.BlockCopy((Array) numArray, 17, (Array) a, 0, 32); byte[] bytes; using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, 1000)) bytes = rfc2898DeriveBytes.GetBytes(32); return Crypto.ByteArraysEqual(a, bytes); } [MethodImpl(MethodImplOptions.NoOptimization)] private static bool ByteArraysEqual(byte[] a, byte[] b) { if (object.ReferenceEquals((object) a, (object) b)) return true; if (a == null || b == null || a.Length != b.Length) return false; bool flag = true; for (int index = 0; index < a.Length; ++index) flag &= (int) a[index] == (int) b[index]; return flag; } } }
Кто-то может спросить, как использовать эти исходные коды. Ниже кратко рассмотрим这个问题.
Вначале я наивно думал, что это всего лишь шифрование, зачем его тщательно читать, просто используй его?
При регистрации пользователей и изменении пароля шифрование пароля выполняется через метод HashPassword, поэтому в новом пользовательском PasswordHasher я, чтобы сравнить пароль входа пользователя, просто шифрую ввод пользователя с помощью HashPassword. Почему бы и нет? Поэтому я создал пользовательский метод VerifyHashedPassword (Verify переводится как проверка), который сравнивает сохраненный в базе данных пароль Pwd и результат处理后 хеширования. Но результат, что каждый раз для одного и того же строки генерируется различный результат шифрования, это не так, как раньше с md5 + salt. Поэтому я снова подумал о методе VerifyHashedPassword по умолчанию.
Итак, в заключение можно сказать, что вы можете использовать способ шифрования Microsoft Identity (Hasher, указанный выше) напрямую, когда сравниваете ввод пользователя и сохраненный в базе данных результат хеширования, используйте метод VerifyHashedPassword(). Даже если не использовать аутентификацию Identity, можно использовать этот шифровальный алгоритм
Вот и все, что было в этой статье, надеюсь, что контент этой статьи поможет вам в изучении или работе, и также надеюсь, что вы будете активно поддерживать呐喊 руководства!
Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета, сайт не обладает правами собственности, не undergone редактирование вручную, и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите, что содержится подозрительное нарушение авторских прав, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. При подтверждении, сайт немедленно удалят подозрительное контент, нарушающее авторские права.