2016-07-06 16 views
5

ASP.NETコアアプリケーションによって最初に生成されたMicrosoft Identityテーブルを持つ既存のSQLデータベースがあります。既存のMicrosoft Identityユーザーテーブルを再利用すると、パスワード(ハッシュ)が一致しない

また、Microsoft Identityを使用するASP.NET 4アプリケーションもあります。

は、元の.NETコアアプリケーションと同じデータベースを使用してログインを検証できるようにしたいと考えています。

ただし、パスワードを検証しようとすると、一致しません。

私は、.NET Coreアプリケーションで生成されたパスワードハッシュをASP.NET 4アプリケーションで検証できないと推測していますが、ここからどこに行くのかはわかりません。 :)

.NETコアアプリケーションにカスタムパスワードハッシングはありません。ハッシングに影響する可能性のある設定を見つけるのに苦労していますか?

何か助けや指針をいただければ幸いです!

編集:これは、Identity V2/V3のさまざまなハッシュアルゴリズムによって発生しているようです。しかし、ASP.NET 4アプリでV3ハッシュアルゴリズムを模倣する方法はわかりません。

答えて

4

がありますドキュメントごとのよう:https://github.com/aspnet/Identity/blob/a8ba99bc5b11c5c48fc31b9b0532c0d6791efdc8/src/Microsoft.AspNetCore.Identity/PasswordHasher.cs

/* ======================= 
    * HASHED PASSWORD FORMATS 
    * ======================= 
    * 
    * Version 2: 
    * PBKDF2 with HMAC-SHA1, 128-bit salt, 256-bit subkey, 1000 iterations. 
    * (See also: SDL crypto guidelines v5.1, Part III) 
    * Format: { 0x00, salt, subkey } 
    * 
    * Version 3: 
    * PBKDF2 with HMAC-SHA256, 128-bit salt, 256-bit subkey, 10000 iterations. 
    * Format: { 0x01, prf (UInt32), iter count (UInt32), salt length (UInt32), salt, subkey } 
    * (All UInt32s are stored big-endian.) 
    */ 

ある時点で、アイデンティティは異なるハッシュアルゴリズムを使用 - 多分それは1で、バージョン2フォーマットを使用して、およびその他におけるバージョン3形式のか?

クラスのコンストラクタはオプションを取ります。正しいハッシュを得るために調整することができますか?

public PasswordHasher(IOptions<PasswordHasherOptions> optionsAccessor = null) 

EDIT:

私はここアイデンティティv2.0のソースが見つかりました:https://aspnetidentity.codeplex.com/とgitのレポ:ソースを通じて探しhttps://git01.codeplex.com/aspnetidentity

を、あなたはそのハッシュ方式に遭遇。 ASPNETアイデンティティコアでV2に比べ

Crypto.HashPassword.cs

public static string HashPassword(string password) 
    { 
     if (password == null) 
     { 
      throw new ArgumentNullException("password"); 
     } 

     // Produce a version 0 (see comment above) text hash. 
     byte[] salt; 
     byte[] subkey; 
     using (var deriveBytes = new Rfc2898DeriveBytes(password, SaltSize, PBKDF2IterCount)) 
     { 
      salt = deriveBytes.Salt; 
      subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength); 
     } 

     var outputBytes = new byte[1 + SaltSize + PBKDF2SubkeyLength]; 
     Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize); 
     Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, PBKDF2SubkeyLength); 
     return Convert.ToBase64String(outputBytes); 
    } 

private static byte[] HashPasswordV2(string password, RandomNumberGenerator rng) 
    { 
     const KeyDerivationPrf Pbkdf2Prf = KeyDerivationPrf.HMACSHA1; // default for Rfc2898DeriveBytes 
     const int Pbkdf2IterCount = 1000; // default for Rfc2898DeriveBytes 
     const int Pbkdf2SubkeyLength = 256/8; // 256 bits 
     const int SaltSize = 128/8; // 128 bits 

     // Produce a version 2 (see comment above) text hash. 
     byte[] salt = new byte[SaltSize]; 
     rng.GetBytes(salt); 
     byte[] subkey = KeyDerivation.Pbkdf2(password, salt, Pbkdf2Prf, Pbkdf2IterCount, Pbkdf2SubkeyLength); 

     var outputBytes = new byte[1 + SaltSize + Pbkdf2SubkeyLength]; 
     outputBytes[0] = 0x00; // format marker 
     Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize); 
     Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, Pbkdf2SubkeyLength); 
     return outputBytes; 
    } 

アイデンティティv2のハッシュとアイデンティティコアv2のハッシュは現在、アイデンティティコアv3のハッシュに比べて、かなり似ているようです:

private static byte[] HashPasswordV3(string password, RandomNumberGenerator rng, KeyDerivationPrf prf, int iterCount, int saltSize, int numBytesRequested) 
    { 
     // Produce a version 3 (see comment above) text hash. 
     byte[] salt = new byte[saltSize]; 
     rng.GetBytes(salt); 
     byte[] subkey = KeyDerivation.Pbkdf2(password, salt, prf, iterCount, numBytesRequested); 

     var outputBytes = new byte[13 + salt.Length + subkey.Length]; 
     outputBytes[0] = 0x01; // format marker 
     WriteNetworkByteOrder(outputBytes, 1, (uint)prf); 
     WriteNetworkByteOrder(outputBytes, 5, (uint)iterCount); 
     WriteNetworkByteOrder(outputBytes, 9, (uint)saltSize); 
     Buffer.BlockCopy(salt, 0, outputBytes, 13, salt.Length); 
     Buffer.BlockCopy(subkey, 0, outputBytes, 13 + saltSize, subkey.Length); 
     return outputBytes; 
    } 

私は何が起こっているのか分からないheseメソッドを使用していましたが、identity v2とidentity coreから、パラメータのないコンストラクタからコンフィグレーションオプションを取るコンストラクタに移動しました。 V2はSHA1を使用し、V3はSHA256を使用します(とりわけ)。

IDのコアのように見えるのは、古いバージョンのIDには存在しないV3メソッドを使用してハッシュすることです。これが問題の原因になります。上記ソースにおける

https://github.com/aspnet/Identity/blob/a8ba99bc5b11c5c48fc31b9b0532c0d6791efdc8/src/Microsoft.AspNetCore.Identity/PasswordHasherOptions.cs

注、V3がデフォルトとして使用されます。それは古い方法が実装されていなかったとしてアイデンティティコアにハッシュされたパスワードは、アイデンティティの古いバージョンで同じハッシュ化することができない意味のよう

/// <summary> 
    /// Gets or sets the compatibility mode used when hashing passwords. 
    /// </summary> 
    /// <value> 
    /// The compatibility mode used when hashing passwords. 
    /// </value> 
    /// <remarks> 
    /// The default compatibility mode is 'ASP.NET Identity version 3'. 
    /// </remarks> 
    public PasswordHasherCompatibilityMode CompatibilityMode { get; set; } = PasswordHasherCompatibilityMode.IdentityV3; 

残念ながら、それが見えます。おそらく、あなたはv3で何が行われたのかを模倣することができますか?

+0

奇妙なことに、PasswordHasherクラスはパラメータのないコンストラクタしか持たないようです。しかし、バージョンの違いにより、コアアプリがID 3になっているのに対して、ASP.NET 4アプリはアイデンティティ2になっているとは限りません。V3は.NET 4.6.1で利用可能ですか? –

+0

私は現在、V3ハッシュアルゴリズムをASP.NET 4アプリケーションに移植しています。さもなければ、私はコアアプリケーションが代わりにV2ハッシュを使用するように変更できると思う(基本的に現在のV3ハッシュをV2ハッシュに移行する)が、私は本当にV3にとどまりたい。あなたのお手伝いをいただきありがとうございます** –

関連する問題