Hash-und salt-Passwörter in C#
War ich einfach nur durch eine DavidHayden Artikel auf Hashing Benutzer-Passwörter.
Wirklich ich kann nicht das bekommen, was er versucht zu erreichen.
Hier ist der code:
private static string CreateSalt(int size)
{
//Generate a cryptographic random number.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
//Return a Base64 string representation of the random number.
return Convert.ToBase64String(buff);
}
private static string CreatePasswordHash(string pwd, string salt)
{
string saltAndPwd = String.Concat(pwd, salt);
string hashedPwd =
FormsAuthentication.HashPasswordForStoringInConfigFile(
saltAndPwd, "sha1");
return hashedPwd;
}
Gibt es andere C# - Methode für das Hashen der Passwörter und die Zugabe von Salz zu?
hier ist eine Bibliothek, die die hashing mit salt encrypto.codeplex.com
Was sollten Sie für die Größe in der ersten Methode zu generieren Salz?
Link ist gebrochen.
Was sollten Sie für die Größe in der ersten Methode zu generieren Salz?
Link ist gebrochen.
InformationsquelleAutor ACP | 2010-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich ist das irgendwie seltsam, mit der string-Konvertierungen - die Mitgliedschaft Anbieter hat Sie in die config-Dateien. Hashes und Salze sind binäre blobs, die Sie nicht brauchen, um Sie zu konvertieren strings, es sei denn, Sie wollen, um Sie in text-Dateien.
In meinem Buch, Anfang ASP.NET Sicherheit, (oh endlich, eine Entschuldigung zu pimpen das Buch) ich mache folgenden
Salz generation ist, wie das Beispiel in der Frage. Sie können konvertieren von text in byte-arrays mit
Encoding.UTF8.GetBytes(string)
. Wenn Sie konvertieren müssen ein hash in seine Zeichenfolgendarstellung, die Sie verwenden könnenConvert.ToBase64String
undConvert.FromBase64String
zu konvertieren zurück.Sollten Sie beachten, dass Sie nicht mit dem Gleichheits-operator auf byte-arrays, es wird überprüft, Referenzen, und so sollten Sie einfach eine Schleife durch beide arrays prüfen jedes byte so
Immer verwenden Sie einen neuen salt pro Passwort. Salze müssen nicht geheim gehalten werden und kann gespeichert werden neben dem hash selbst.
nette LINQ-Anweisung Refactoring für CompareByteArrays
return array1.Length == array2.Length && !array1.Where((t, i) => t != array2[i]).Any();
Technisch, ja, aber mit einem einzigartige salt für jeden user macht die Rainbow-Tabellen (allgemein als die effizienteste Art und Weise zu knacken, Hash-Passwörter) sind praktisch nutzlos. Dies ist eine schnelle oveview bietet eine in-Tiefe, aber nicht überwältigend überblick, wie Sie speichern Passwörter sicher, und warum/wie es funktioniert.
Sie sollten hinzufügen .ToList() zu machen, Konstante Zeit. z.B.: return array1.Länge == Matrix2.Länge && !array1.Where((t, i) => t != array2[i]).ToList().Jede(); Else, LINQ zurückkehren wird, sobald er feststellt, ein byte, dass ist nicht gleich.
-1 für die Verwendung einer schnellen hash-Funktion. Verwenden Sie eine langsame Konstruktion wie PBKDF2, bcrypt oder scrypt.
InformationsquelleAutor blowdart
Was blowdart gesagt, aber mit ein wenig weniger code. Verwenden von Linq oder
CopyTo
zu verketten arrays.Linq bietet eine einfache Möglichkeit für den Vergleich der byte-arrays zu.
Vor der Umsetzung dieser jedoch, check-out dieser Beitrag. Für die Passwort-hashing-möchten Sie vielleicht eine langsame hash-Algorithmus, der nicht einem schnellen.
Zu diesem Zweck gibt es die
Rfc2898DeriveBytes
- Klasse, die langsam (und langsamer), und die Antwort auf den zweiten Teil der ursprünglichen Frage, dass es dauern kann, ein Passwort und Salz und geben Sie einen hash. Sehen diese Frage für weitere Informationen. Beachten Sie, Stack Exchange ist mitRfc2898DeriveBytes
für das Passwort-hashing (source code hier).InformationsquelleAutor Adam Boddington
Habe ich gelesen, dass Hash-Funktionen wie SHA256 waren nicht wirklich vorgesehen für den Einsatz mit Speicherung der Passwörter:
https://patrickmn.com/security/storing-passwords-securely/#notpasswordhashes
Statt adaptive Schlüssel-Ableitung Funktionen wie PBKDF2, bcrypt oder scrypt wurden. Hier ist ein PBKDF2 auf der Basis, dass Microsoft schrieb für PasswordHasher in Ihre Microsoft.AspNet.Identität Bibliothek:
Hinweis: dies erfordert Microsoft.AspNetCore.Die Kryptographie.KeyDerivation nuget-Paket installiert, die benötigt werden .NET-Standard 2.0 (.NET 4.6.1 oder höher). Für frühere Versionen von .NET finden Sie in der Crypto - Klasse aus der Microsoft-System.Web.Helfer-Bibliothek.
Update Nov 2015
Aktualisierte Antwort zu verwenden, um eine Implementierung aus einem anderen Microsoft-Bibliothek, die verwendet PBKDF2-HMAC-SHA256-hashing statt PBKDF2-HMAC-SHA1 (Hinweis PBKDF2-HMAC-SHA1-Hash ist noch sicherer wenn iterCount ist hoch genug). Sie können sich die Quelle der vereinfachte code wurde kopiert aus als es tatsächlich behandelt zu validieren und zu aktualisieren hashes implementiert, die von der vorherigen Antwort, hilfreich, wenn Sie brauchen, um zu erhöhen iterCount in die Zukunft.
1) Reduzieren
PBKDF2SubkeyLength
20 bytes. Das ist die Natürliche Größe f SHA1 und erhöhen darüber hinaus verlangsamt sich der Verteidiger ohne eine Verlangsamung der Angreifer. 2) ich empfehle die Erhöhung der iterationsanzahl. Ich empfehle 10k bis 100k je nach Ihrer performance budget. 3) Eine Konstante Zeit-Vergleich würde nicht Schaden, aber nicht viel praktische Auswirkungen.KeyDerivationPrf, KeyDerivation und BlockCopy ist nicht definiert, welche Klassen?
Haben Sie bei der Installation der Microsoft.AspNet.Die Kryptographie.KeyDerivation nuget-Paket erwähnt? Wenn das nicht geeignet hier ist eine version, die nicht erfordern den nuget-Paket. Puffer.BlockCopy vorhanden sein sollte, es ist Teil des Systems.
Das nuget-Paket ist jetzt von Microsoft.AspNetCore.Die Kryptographie.KeyDerivation.
InformationsquelleAutor Michael
Salz wird verwendet, um hinzufügen eine zusätzliche Ebene der Komplexität, wenn die hash-Werte, die es schwerer zu machen, um brute-force zu knacken.
Aus einer Artikel auf Sitepoint:
Gibt es keine Methode automatisch auf, dies zu tun .NET, also müssen Sie gehen mit der Lösung oben.
Salze werden verwendet, um zu verteidigen gegen Dinge wie die rainbow-Tabellen. Zur Abwehr von Wörterbuch-Angriffen eine Arbeit Faktor (auch bekannt als key stretching) erforderlich ist, wie jede gute KDF: en.wikipedia.org/wiki/Key_stretching
InformationsquelleAutor Seb Nilsson
Ich eine Klasse angelegt, die die folgende Methode:
Eingaben überprüfen
`
InformationsquelleAutor Bamidele Alegbe
Bah, das ist besser! http://sourceforge.net/projects/pwdtknet/ und es ist besser, weil ..... es führt Key Stretching UND verwendet HMACSHA512 🙂
InformationsquelleAutor thashiznets
Habe ich eine Bibliothek SimpleHashing.Net, um den Prozess der Vermischung leicht mit basic-Klassen, die von Microsoft bereitgestellt. Gewöhnliche SHA ist nicht wirklich genug, um Passwörter sicher gespeichert mehr.
Die Bibliothek nutzen, die Idee der hash-format von Bcrypt, aber da es keine offizielle MS-Implementierung, die ich lieber verwenden, was verfügbar ist, in den Rahmen (z.B. PBKDF2), aber es ist ein bisschen zu hart out of the box.
Dies ist ein kurzes Beispiel, wie die Bibliothek zu benutzen:
InformationsquelleAutor Ilya Chernomordik
Dies ist, wie ich es tun.. ich erstelle die Raute und speichern Sie mit der
ProtectedData
api:InformationsquelleAutor JGU
Lese ich alle Antworten und ich denke, diejenigen, die genug, speziell @Michael Artikel mit langsamen Vermischung und @CodesInChaos gute Kommentare, aber ich beschlossen, zu teilen mein code-snippet für das hashing/Validierung, die nützlich sein können und es nicht erforderlich [Microsoft.AspNet.Die Kryptographie.KeyDerivation].
Bitte achten Sie SlowEquals so wichtige Funktion, Schließlich, ich hoffe, dies hilft und Bitte zögern Sie nicht, um mich beraten über bessere Ansätze.
InformationsquelleAutor QMaster
InformationsquelleAutor ankush shukla
In Antwort auf diesen Teil der ursprünglichen Frage "gibt es andere C# - Methode für das Hashen der Passwörter" können Sie dies erreichen mit ASP.NET Identität v3.0 https://www.nuget.org/packages/Microsoft.AspNet.Identity.EntityFramework/3.0.0-rc1-final
InformationsquelleAutor Dave Cornall
InformationsquelleAutor ehsan