Ihr Passwort ist nicht nur eine Zeichenfolge: Warum Authentifizierung in C# einen besonderen Ansatz erfordert
\n\nStellen Sie sich vor: Sie haben eine perfekte C#-Anwendung geschrieben – mit schöner Oberfläche, schnellen Abfragen und sauberer Architektur. Aber wenn die Authentifizierung darin undicht ist, ist die ganze Arbeit umsonst. Hacker knacken keine Türen – sie probieren Schlüssel aus. Und in der modernen Welt ist sichere Authentifizierung in C# keine Option, sondern grundlegende Code-Hygiene.
\n\nIn diesem Artikel behandeln wir nicht nur die Theorie, sondern echte Schutzmethoden: vom korrekten Passwort-Hashing bis zur Implementierung von JWT und OAuth. Sie erfahren, warum SHA256 ohne Salt böse ist, wie man Brute-Force-Angriffen nicht auf den Leim geht und was zu tun ist, wenn Ihr Projekt bereits aus den "kindlichen" Authentifizierungsmethoden herausgewachsen ist. Los geht's!
\n\nDie drei Säulen der Sicherheit: Hashing, Salt und langsame Algorithmen
\n\nDas häufigste Anti-Pattern von Anfängern ist es, Passwörter im Klartext zu speichern oder einfaches MD5 zu verwenden. Selbst wenn Sie "nur ein Übungsprojekt" haben, verfestigt sich die Gewohnheit. Sichere Authentifizierung in C# beginnt mit drei Regeln:
\n\n- \n
- Speichern Sie Passwörter niemals im Klartext. Auch nicht in einer lokalen Datenbank. \n
- Verwenden Sie Salt – eine zufällige Zeichenfolge für jeden Benutzer. \n
- Wählen Sie langsame Algorithmen – BCrypt, PBKDF2, Argon2. \n
Warum "langsam"? Weil ein Hacker Milliarden von Kombinationen pro Sekunde durchprobieren muss. Wenn das Hashing 0,1 Sekunden dauert, wird der Angriff wirtschaftlich uninteressant.
\n\nKorrektes Passwort-Hashing in C# am Beispiel von BCrypt
\n\nBCrypt ist der Goldstandard für .NET-Entwickler. Es generiert selbstständig Salt und bettet es in den Hash ein. Sie müssen Salt nicht separat speichern.
\n\nInstallieren Sie das Paket über NuGet:
\nInstall-Package BCrypt.Net-Next\n\nNun ein Beispiel für die Benutzerregistrierung:
\n\nusing BCrypt.Net;\n\npublic class AuthService\n{\n public string HashPassword(string plainPassword)\n {\n // Work factor = 12 – optimales Gleichgewicht zwischen Geschwindigkeit und Sicherheit\n return BCrypt.HashPassword(plainPassword, workFactor: 12);\n }\n\n public bool VerifyPassword(string plainPassword, string hashedPassword)\n {\n return BCrypt.Verify(plainPassword, hashedPassword);\n }\n}\n\n// Verwendung:\nvar auth = new AuthService();\nstring hash = auth.HashPassword("MyS3cur3P@ss!");\nbool isValid = auth.VerifyPassword("MyS3cur3P@ss!", hash); // true\n\nBeachten Sie: workFactor (Kostenfaktor) bestimmt, wie viele Hashing-Iterationen durchgeführt werden. 12 ist ein guter Wert für das Jahr 2024. Wenn Ihr Server leistungsstark ist, können Sie auf 13-14 erhöhen.
PBKDF2 – integriertes Tool in .NET
\n\nWenn Sie keine externen Bibliotheken verwenden möchten, nutzen Sie Rfc2898DeriveBytes – die integrierte PBKDF2-Implementierung in .NET. Beispiel:
using System.Security.Cryptography;\n\npublic static string HashWithPBKDF2(string password, byte[] salt, int iterations = 100_000)\n{\n using var deriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256);\n byte[] hash = deriveBytes.GetBytes(32); // 32 Bytes = 256 Bit\n return Convert.ToBase64String(salt) + ":" + Convert.ToBase64String(hash);\n}\n\n// Salt-Generierung (16 Bytes)\nbyte[] salt = RandomNumberGenerator.GetBytes(16);\nstring result = HashWithPBKDF2("userPassword", salt);\n\nWichtig: Verwenden Sie nicht weniger als 100.000 Iterationen. Moderne GPUs können Millionen von Hashes pro Sekunde durchprobieren.
\n\nJWT – moderne Authentifizierung ohne Sessions
\n\nWenn Ihre C#-Anwendung auf Microservices oder SPAs (React, Vue) anwächst, wird das Speichern von Sessions auf dem Server unpraktisch. Hier kommen JSON Web Tokens (JWT) zur Hilfe – kompakte, eigenständige Zugriffstoken.
\n\nSichere Authentifizierung in C# mit JWT basiert auf drei Prinzipien:
\n- \n
- T