Bios.Security.Primitives 0.2.0

Bios.Security.Primitives

Bir kimlik servisinin üzerine kurulduğu temel parçalar: parola karması, opak jeton üretimi, TOTP, yedek kodlar ve sır saklama. Kriptografiyi çağırırız, yazmayız — karma Konscious kütüphanesinin Argon2'sidir, TOTP Otp.NET'tir; bu paketin işi doğru parametreleri, doğru saklama biçimini ve yanlış yapılandırmayı açılışta reddetmeyi sabitlemektir.

İçindekiler:

  • Argon2PasswordHasher. Argon2id, 64 MB bellek, 3 tur. Parametreler karma metniyle birlikte saklanır; parametreler yükselirse eski karma ilk başarılı girişte sessizce yenilenir.
  • TokenFactory. 32 baytlık rastgele opak jeton üretir, URL güvenli base64 ile yazar. Saklanacak değer jetonun kendisi değil SHA-256 özetidir; sızan bir veritabanı yedeği oturum çalmaya yetmez. Argon2 gerekmez çünkü girdi zaten 32 rastgele bayttır, sözlük saldırısı diye bir şey kalmaz.
  • Base64Url. Dolgu işaretsiz, URL güvenli base64.
  • TotpAuthenticator. TOTP üretimi ve doğrulaması, bir pencere hoşgörüyle.
  • BackupCodeGenerator. Tek kullanımlık yedek kodlar; saklanan yine özettir.
  • AesGcmSecretProtector. Simetrik anahtar ile sır saklama. Yanlış anahtar açılışta patlar, ilk kullanıcıda değil.

Sözleşmelerin hepsi arayüz olarak da paketin içindedir; test sahteleri kolay yazılır. Paket hiçbir ağ çerçevesine bağlı değil: kimlik yüzeyinde de, arka plan işçisinde de aynı şekilde kullanılır.

Bağlama

services.AddBiosSecurityPrimitives(configuration);   // Security bölümünü okur

Tek çağrı beş sözleşmeyi de kaydeder — IPasswordHasher, ITokenFactory, IBackupCodeGenerator, ITotpAuthenticator, ISecretProtector — ve TotpAuthenticator'ın istediği saati TimeProvider.System olarak koyar. Saati koyarken TryAddSingleton kullanılır: kendi saatini kaydetmiş bir uygulama (çoğu zaman testteki sahte saat) kendi saatiyle kalır.

Yürürlüğe giren ayarlar SecurityOptions olarak da kaydedilir; ne okunduğunu görmek isteyen okuyabilir.

public sealed class TwoFactorEnrolment
{
    private readonly ITotpAuthenticator _totp;
    private readonly ISecretProtector _protector;

    public TwoFactorEnrolment(ITotpAuthenticator totp, ISecretProtector protector)
    {
        _totp = totp;
        _protector = protector;
    }

    // Kullanıcının QR koddan okuyacağı adres ile veritabanına yazılacak sır.
    // Sır şifrelenerek saklanır; her kod doğrulamasında geri okunmak zorunda
    // olduğu için karma bir seçenek değil.
    public (string EnrolmentUri, string StoredSecret) Begin(string email)
    {
        var secret = _totp.NewSecret();

        return (_totp.EnrolmentUri(secret, email, "Acme"),
                _protector.Protect(secret));
    }
}

Yapılandırma

Bölüm adı Security — kodda SecurityOptions.SectionName.

Anahtar Zorunlu Varsayılan Ne işe yarar
Security:ProtectionKey evet yok ISecretProtector'ın şifrelediği AES-256-GCM anahtarı. 32 bayt, base64
Security:Argon2MemoryKb hayır 65536 Argon2id bellek maliyeti, kilobayt. En düşük 19456
Security:Argon2Iterations hayır 3 Bellek üzerinden geçiş sayısı. En düşük 2
Security:Argon2Parallelism hayır 1 Argon2id şerit sayısı. En düşük 1
{
  "Security": {
    "ProtectionKey": "3Qx0k5aVQ0m8Yy1u7tR2pL9sN4wZ6cE8bH0dF2gJ1kM=",
    "Argon2MemoryKb": 65536,
    "Argon2Iterations": 3,
    "Argon2Parallelism": 1
  }
}

Anahtar üretimi:

openssl rand -base64 32

Dikkat

Koruma anahtarı sır saklayıcıya aittir, appsettings.json'a değil. Yukarıdaki blok anahtarın şeklini göstermek için orada; gerçek değer ortam değişkeninden (Security__ProtectionKey) ya da sır kasasından gelir ve veritabanı yedeğiyle aynı yerde durmaz. Yedek ile anahtar aynı yerdeyse şifreleme hiçbir şey korumaz.

Anahtar yoksa uygulama açılmaz. Varsayılanı yoktur ve olamaz: üretilen bir anahtar her yeniden başlatmada değişip dünkü sırları okunamaz hale getirirdi, paketle gelen bir anahtar ise her kurulumun sırlarını kaynak kodda yazan bir değerle şifrelerdi. Anahtar eksikse, base64 değilse ya da 32 bayta çözülmüyorsa AddBiosSecurityPrimitives orada, kayıt sırasında InvalidOperationException fırlatır — ilk kullanıcı geldiğinde değil.

Argon2 maliyeti düşürülebilir ama bir tabana kadar. 19456 KB bellek ve 2 tur, OWASP'ın hâlâ anlamlı saydığı en düşük ayardır; altına inen değer reddedilir. Sebebi: maliyeti düşürmek yavaş bir girişi hızlandırmanın en kolay yoludur ve sessizdir — uygulamada hiçbir şey değişmez, yalnız çalınan bir parola tablosunu kırmak ucuzlar. Sayı olmayan bir değer de ("64mb" gibi) sessizce varsayılana dönmez, reddedilir.

Anahtar değiştirmek eski sırları açmaz. Saklanan biçim v1. önekiyle başlar, yani ileride ikinci bir anahtar tanıtılabilir; bugün ise anahtar değişince o anahtarla yazılmış her sır Unprotect çağrısından null döner ve ilgili kullanıcının iki adımlı doğrulaması yeniden kurulmalıdır.

No packages depend on Bios.Security.Primitives.

Version Downloads Last updated
0.2.0 100 08/29/2026
0.1.0 2 08/29/2026