欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Asp.net中Microsoft.Identity的IPasswordHasher加密的默認實現與運用

 更新時間:2017年02月17日 17:10:16   作者:坦蕩  
本文主要介紹了Microsoft.Identity的IPasswordHasher加密的默認實現與運用。具有很好的參考價值,下面跟著小編一起來看下吧

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

UserManager.PasswordHasher.HashPassword(password)

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

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

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

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

所以為了兼容多個應用不同的加密方式,我不得不反編譯出源碼,拿到其默認加密方式,根據不同應用名稱,來判斷對密碼加密或者解密,或者直接通過某種方式來對比數據庫和用戶輸入的密碼。先上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認證 也可以用此加密算法

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關文章

  • 在.ashx文件中獲取cookies值實現代碼

    在.ashx文件中獲取cookies值實現代碼

    .ashx文件中獲取cookies值對于一些高手們就不多說了,至于一些小白們還是有必要多多學習啊,好了話不多說,看代碼,感興趣的你可不要錯過了哈
    2013-02-02
  • LINQ to XML的編程基礎

    LINQ to XML的編程基礎

    本文介紹了LINQ to XML的編程基礎,即System.Xml.Linq命名空間中的多個LINQ to XML類,這些類都是LINQ to XML的支持類,它們使得處理xml比使用其他的xml工具容易得多。在本文中,著重介紹的是XElement、XAttribute和XDocument。
    2010-02-02
  • Live Write 的代碼高亮插件 Paste Code

    Live Write 的代碼高亮插件 Paste Code

    這些天,開始使用Live Write寫博客了,有時候貼代碼時,感覺很不爽。用了很多代碼高亮的工具,大多只支持少數的幾種語言。
    2011-04-04
  • .NET 中的裝箱與拆箱實現過程

    .NET 中的裝箱與拆箱實現過程

    本文分別介紹裝箱(boxing)與拆箱(unboxing)的實現過程,感興趣的朋友可以了解下
    2013-01-01
  • 為密碼文本框要求不可粘帖字符串只可手動輸入(附演示動畫)

    為密碼文本框要求不可粘帖字符串只可手動輸入(附演示動畫)

    以前開發(fā)程序時,用戶登錄的密碼文本框,是可以粘帖密碼字符串的,為了安全起見用戶要求不要粘帖,只能由手動輸入,感興趣的朋友可以了解下
    2013-01-01
  • ASP.NET:一段比較經典的多線程學習代碼

    ASP.NET:一段比較經典的多線程學習代碼

    ASP.NET:一段比較經典的多線程學習代碼...
    2006-09-09
  • 解決ASP.NET Core Mvc文件上傳限制問題實例

    解決ASP.NET Core Mvc文件上傳限制問題實例

    本篇文章主要介紹了解決ASP.NET Core Mvc文件上傳限制問題,具有一定的參考價值,有需要的可以了解一下。
    2016-11-11
  • ASP.NET 應用程序級 驗證用戶是否登錄 一般處理程序

    ASP.NET 應用程序級 驗證用戶是否登錄 一般處理程序

    驗證用戶登錄后才能訪問頁面和進行操作的方法有好幾種,比如:Forms,基類中處理、窗體類繼承基類,單獨寫個方法在每個窗體類的Page_Load中調用等。
    2010-07-07
  • .NET Core API CORS的實現

    .NET Core API CORS的實現

    這篇文章主要介紹了.NET Core API CORS的實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • asp.net錯誤處理Application_Error事件示例

    asp.net錯誤處理Application_Error事件示例

    Application_Error事件與Page_Error事件相類似,可使用他捕獲發(fā)生在應用程序中的錯誤。由于事件發(fā)生在整個應用程序范圍內,因此您可記錄應用程序的錯誤信息或處理其他可能發(fā)生的應用程序級別的錯誤
    2014-01-01

最新評論