ASP.NET Core'da karma parolalar

Bu makalede PBKDF2 algoritmasını KeyDerivation.Pbkdf2kullanarak parola karmasına izin veren yönteminin nasıl çağrıldığı gösterilmektedir.

Uyarı

KeyDerivation.Pbkdf2 API, düşük düzeyli bir şifreleme temelidir ve uygulamaları mevcut bir protokol veya şifreleme sistemiyle tümleştirmek için kullanılması amaçlanmıştır. KeyDerivation.Pbkdf2 parola tabanlı oturum açmayı destekleyen ve karma parolaları bir veri deposunda depolaması gereken yeni uygulamalarda kullanılmamalıdır. Yeni uygulamalar kullanmalıdır PasswordHasher. hakkında PasswordHasherdaha fazla bilgi için bkz . ASP.NET Çekirdek Identity Parolasını KeşfetmeHasher.

Veri koruma kod tabanı, şifreleme anahtarı türetme işlevlerini içeren bir NuGet paketi Microsoft.AspNetCore.Cryptography.KeyDerivation içerir. Bu paket tek başına bir bileşendir ve veri koruma sisteminin geri kalanında hiçbir bağımlılığı yoktur. Bağımsız olarak kullanılabilir. Kaynak, kolaylık sağlamak için veri koruma kod tabanıyla birlikte bulunur.

Uyarı

Aşağıdaki kod, paylaşılan gizli anahtar oluşturmak için nasıl kullanılacağını KeyDerivation.Pbkdf2 gösterir. Veri deposundaki depolama için parola karması yapmak için kullanılmamalıdır.

using Microsoft.AspNetCore.Cryptography.KeyDerivation;
using System.Security.Cryptography;

Console.Write("Enter a password: ");
string? password = Console.ReadLine();

// Generate a 128-bit salt using a sequence of
// cryptographically strong random bytes.
byte[] salt = RandomNumberGenerator.GetBytes(128 / 8); // divide by 8 to convert bits to bytes
Console.WriteLine($"Salt: {Convert.ToBase64String(salt)}");

// derive a 256-bit subkey (use HMACSHA256 with 100,000 iterations)
string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
    password: password!,
    salt: salt,
    prf: KeyDerivationPrf.HMACSHA256,
    iterationCount: 100000,
    numBytesRequested: 256 / 8));

Console.WriteLine($"Hashed: {hashed}");

/*
 * SAMPLE OUTPUT
 *
 * Enter a password: Xtw9NMgx
 * Salt: CGYzqeN4plZekNC88Umm1Q==
 * Hashed: Gt9Yc4AiIvmsC1QQbe2RZsCIqvoYlst2xbz0Fs8aHnw=
 */
using System;
using System.Security.Cryptography;
using Microsoft.AspNetCore.Cryptography.KeyDerivation;

public class Program
{
    public static void Main(string[] args)
    {
        Console.Write("Enter a password: ");
        string password = Console.ReadLine();

        // generate a 128-bit salt using a cryptographically strong random sequence of nonzero values
        byte[] salt = new byte[128 / 8];
        using (var rngCsp = new RNGCryptoServiceProvider())
        {
            rngCsp.GetNonZeroBytes(salt);
        }
        Console.WriteLine($"Salt: {Convert.ToBase64String(salt)}");

        // derive a 256-bit subkey (use HMACSHA256 with 100,000 iterations)
        string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
            password: password,
            salt: salt,
            prf: KeyDerivationPrf.HMACSHA256,
            iterationCount: 100000,
            numBytesRequested: 256 / 8));
        Console.WriteLine($"Hashed: {hashed}");
    }
}

/*
 * SAMPLE OUTPUT
 *
 * Enter a password: Xtw9NMgx
 * Salt: CGYzqeN4plZekNC88Umm1Q==
 * Hashed: Gt9Yc4AiIvmsC1QQbe2RZsCIqvoYlst2xbz0Fs8aHnw=
 */
 

Gerçek dünya kullanım örneği için ASP.NET Core'un IdentityPasswordHasher türüne ilişkin kaynak koduna bakın.

Dekont

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).