Sichere Authentifizierung in C#: Schutz, der nicht geknackt wird

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Ihr Passwort ist nicht nur eine Zeichenfolge: Warum Authentifizierung in C# einen besonderen Ansatz erfordert

\n\n

Stellen 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\n

In 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\n

Die drei Säulen der Sicherheit: Hashing, Salt und langsame Algorithmen

\n\n

Das 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
\n\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\n

Korrektes Passwort-Hashing in C# am Beispiel von BCrypt

\n\n

BCrypt 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\n

Installieren Sie das Paket über NuGet:

\n
Install-Package BCrypt.Net-Next
\n\n

Nun ein Beispiel für die Benutzerregistrierung:

\n\n
using 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\n

Beachten 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.

\n\n

PBKDF2 – integriertes Tool in .NET

\n\n

Wenn Sie keine externen Bibliotheken verwenden möchten, nutzen Sie Rfc2898DeriveBytes – die integrierte PBKDF2-Implementierung in .NET. Beispiel:

\n\n
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\n

Wichtig: Verwenden Sie nicht weniger als 100.000 Iterationen. Moderne GPUs können Millionen von Hashes pro Sekunde durchprobieren.

\n\n

JWT – moderne Authentifizierung ohne Sessions

\n\n

Wenn 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\n

Sichere Authentifizierung in C# mit JWT basiert auf drei Prinzipien:

\n
    \n
  • T

Blogs

Buchempfehlungen