91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Asp.net中Microsoft.Identity的IPasswordHasher加密的示例分析

發布時間:2021-07-13 11:59:52 來源:億速云 閱讀:122 作者:小新 欄目:開發技術

這篇文章主要介紹了Asp.net中Microsoft.Identity的IPasswordHasher加密的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

相信了解了MS Identity認證體系的一定知道UserManager的作用,他是整個體系中的調度者,他定義了一套用戶行為來幫助我們管理用戶信息,角色信息,處理密碼等。而其實現則在UserStore當中,我們可以實現其為我們定義的比如IUserStore,IUserPasswordStore,IRoleStore等等. 我們可以基于一整套用戶行為,自定義自己的用戶信息和數據結構以及數據存儲。那么關于Password的Hasher,MS依然為我們提供了完整的行為定義,也由UserManager來調度。比如

UserManager.PasswordHasher.HashPassword(password)

PasswordHasher在UserManager接口中是這樣定義的:

Asp.net中Microsoft.Identity的IPasswordHasher加密的示例分析

我原本對其默認實現是沒有興趣的,出于獨立多個應用的登陸認證的目的,所以需要一個獨立的用戶認證項目來作為認證服務,其僅生產token,認證成功后,用戶的HTTP Request Header的Authorization帶著 token來訪問應用服務器上的各種資源。

就是因為這樣的原因,在多個應用的密碼認證上出現了這樣一個問題:

比如應用A采用了實現IPasswordHasher來自定義加密方式——MD5+salt的形式,而應用B則采用了Identity默認的PasswordHasher來實現,通過反編譯得到如下代碼:

Asp.net中Microsoft.Identity的IPasswordHasher加密的示例分析

所以為了兼容多個應用不同的加密方式,我不得不反編譯出源碼,拿到其默認加密方式,根據不同應用名稱,來判斷對密碼加密或者解密,或者直接通過某種方式來對比數據庫和用戶輸入的密碼。先上MS默認的PasswordHasher具體實現

// Decompiled with JetBrains decompiler
// Type: Microsoft.AspNet.Identity.Crypto
// Assembly: Microsoft.AspNet.Identity.Core, Version=2.0.0.0, Culture=neutral, 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中,為應用B對比用戶登錄密碼的時候,把用戶輸入直接通過HashPassword加密一邊不就好了?所以我自定義的VerifyHashedPassword (Verify譯為核實)方法,就是比較數據庫中的Pwd和經過hasher處理的結果是否相等。 可結果是,每次相同的字符串,會產生不同的加密結果,和以前玩md5+salt不一樣呀。所以我又想到了其默認實現的  VerifyHashedPassword 方法。

所以最后要說的就是 你可以拿來微軟Identity的加密方式(上面的Hasher)直接使用 , 在比較用戶輸入和數據庫中已經經過hash的存儲結果進行對比的時候,使用其 VerifyHashedPassword()方法。即使不使用Identity認證 也可以用此加密算法

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Asp.net中Microsoft.Identity的IPasswordHasher加密的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东宁县| 博白县| 长乐市| 务川| 观塘区| 临泽县| 白朗县| 岗巴县| 万宁市| 梨树县| 二连浩特市| 新竹市| 醴陵市| 密云县| 河南省| 威海市| 南部县| 衡水市| 安化县| 台湾省| 江都市| 夏津县| 陆河县| 青川县| 错那县| 天津市| 门头沟区| 海伦市| 如皋市| 固镇县| 德州市| 奉化市| 根河市| 宝坻区| 佛山市| 义马市| 平陆县| 青海省| 鹤壁市| 肃南| 子长县|