: - belki birinde sürüm 2 formatını kullanıyor ve diğer sürüm 3 formatını Bir noktada 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.)
*/
, kimlik, farklı bir karma algoritması kullanılır?
Sınıfın kurucusu seçenekleri alır, doğru kareyi almak için bunu ayarlamayı deneyebilirsiniz?
public PasswordHasher(IOptions<PasswordHasherOptions> optionsAccessor = null)
DÜZENLEME:
burada Kimlik v2.0 kaynağını bulduk: https://aspnetidentity.codeplex.com/ ve git repo: https://git01.codeplex.com/aspnetidentity
kaynak üzerinden baktığımızda, onun özetleme yöntemi rastlamak. aspnet kimlik çekirdekte v2 ile karşılaştırıldığında
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;
}
Kimlik v2 karma ve kimlik çekirdek v2 karma şimdi kimlik çekirdek v3 karma kıyasla oldukça benzer görünüyor :
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;
}
Neler olup bittiğini anlamak için yapmıyorum hese yöntemleri, ancak kimlik v2 ve kimlik çekirdeğinden, parametresiz bir yapıcıdan, yapılandırma seçeneklerini alan bir tanesine gittik. V2, SHA1 kullanır, V3 SHA256'yı kullanır (başka şeylerin yanı sıra).
Varsayılan olarak kimlik çekirdeği, kimliğin eski sürümünde mevcut olmayan V3 yöntemini kullanıp, sorununun nedeni olabilir.Yukarıdaki kaynağı
https://github.com/aspnet/Identity/blob/a8ba99bc5b11c5c48fc31b9b0532c0d6791efdc8/src/Microsoft.AspNetCore.Identity/PasswordHasherOptions.cs
Not, V3, varsayılan olarak kullanılır. o eski yöntem uygulanmadı gibi kimlik çekirdeğinde karma edildi şifreleri, kimlik eski sürümünde aynı karma anlamına gelir gibi
/// <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;
Ne yazık ki görünüyor. Belki de v3'te neler yapıldığını taklit edebilirsin?
Tek, PasswordHasher sınıfı yalnızca parametresiz bir kurucuya sahip görünüyor. Ancak bir sürüm farkı bunu açıklayabilir, Core uygulaması Identity 3'te, ASP.NET 4 uygulaması ise Identity 2'de. V3'ün .NET 4.6.1 için mevcut olduğundan emin değil misiniz? –
Şu anda ASP.NET 4 uygulamasına V3 karma algoritmasını aktarmayı düşünüyorum. Aksi takdirde Core uygulamasının V2 hashing'i kullanmak için değiştirilebileceğini tahmin ediyorum (temelde geçerli V3 karmalarını V2 karmalarına geçiriyorum), ama V3'te kalmayı tercih ederim. Yardımın için çok teşekkürler! –