がありますドキュメントごとのよう: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で何が行われたのかを模倣することができますか?
奇妙なことに、PasswordHasherクラスはパラメータのないコンストラクタしか持たないようです。しかし、バージョンの違いにより、コアアプリがID 3になっているのに対して、ASP.NET 4アプリはアイデンティティ2になっているとは限りません。V3は.NET 4.6.1で利用可能ですか? –
私は現在、V3ハッシュアルゴリズムをASP.NET 4アプリケーションに移植しています。さもなければ、私はコアアプリケーションが代わりにV2ハッシュを使用するように変更できると思う(基本的に現在のV3ハッシュをV2ハッシュに移行する)が、私は本当にV3にとどまりたい。あなたのお手伝いをいただきありがとうございます** –