2010-12-09 7 views
2

Ich baue ein Projekt von Grund auf und möchte Dinge auf die richtige Art und Weise tun. Ich habe online über Hashes gelesen und das ist im Grunde ein Passwort in 64 Buchstaben von Hokuspokus, richtig?Wie kann ich Salting + Hashing in meiner ASP.Net-Anwendung verwenden?

Was ist mit dem Salzen?

Meine Fragen sind:

  1. Wie Hash ich eine Zeichenfolge mit C#?
  2. Was wäre der Felddeklarationstyp in MSSQL? nvarchar (64)?
  3. Was ist Salzen und muss ich das irgendwo in meiner Datenbank speichern?
  4. Wenn ich Facebook Connect verwenden möchte, muss ich mir Sorgen machen, dass ein Hash/Salz erstellt wird?

Codebeispiele sind bevorzugt. Vielen Dank!

Antwort

1

Ich werde Frage 1 überspringen, da ich keine C# Person bin.

Frage 3:

Salting wird, bevor Hashing eine Reihe von Zufallsdaten, um das Passwort hinzufügen. Salze sind essentiell, denn ohne sie ist es einem Angreifer möglich, einen rainbow table bekannten Passwort-Hashes vorzugenerieren. Salzen bedeutet, dass Rainbow-Tabellen nicht vorkonfiguriert werden können, und jedes Passwort muss separat routinemäßig erzwungen werden.

Es ist wichtig, ein neues Salz für jedes Passwort zu generieren.

Salzwerte sind nicht geheim und können zusammen mit dem Hash-Passwort in Ihrer Datenbank gespeichert werden.

Pseudocode zum Erzeugen und Überprüfen des Passworts ist wie folgt:

generatePassword(String user, String password) { 
    String salt = generateRandomSalt(); 
    String salted = salt + password; 
    String hash = hexEncode(hash(salted)); 
    store(user, hash, salt); 
} 

checkPassword(String user, String testPassword) { 
    String salt = lookupSalt(user); 
    String salted = salt + testPassword; 
    String testHash = hexEncode(hash(salted)); 
    return testHash.equals(lookupHash(user)); 
} 

Frage 2:

Die Länge des Datenbankfeldes hängt von dem Hash-Algorithmus. SHA1 generiert 160-Bit-Ausgabe, so dass es 40 Zeichen wird, wenn Hex-codiert wird. Eine gute Faustregel ist die Verwendung eines Salzes, das die gleiche Größe wie die Hash-Ausgabe hat. Sie haben also zwei 40-Zeichen-Spalten: eine für Salz und eine für den Hash.

Frage 4:

Keine Ahnung, wie Facebook Connect funktioniert, sorry. Ich hoffe, die anderen beiden Antworten sind hilfreich.

+2

Wenn Sie * Right Way (TM) wirklich wollen, dann könnten Sie auch iteriertes Hashing in Erwägung ziehen. Das bedeutet Sicherheit gegen CPU-Zeit, aber es ist extrem schwierig für einen Angreifer, ein einzelnes Passwort zu erzwingen. Ohne es ist es möglich, ein einzelnes Passwort in nur wenigen Stunden zu brechen (siehe http://stackoverflow.com/questions/2772014/is-sha-1-secure-for-password-storage). –

+0

Sie waren enorm hilfreich. Danke für Ihre Hilfe. –

+2

Guter Punkt über wiederholtes Hashing. In C# erfordert das Erzeugen eines Schlüssels mit PBKDF2 keinen Code mehr als das Erzeugen eines einfachen gesalzenen Hash. Siehe meine Antwort hier für Details: http://stackoverflow.com/questions/4329909/hashing-passwords-with-md5-or-sha-256-c/4330586#4330586 – LukeH

1

1) Code

public static string HashStringSha1(string plainText, string salt) 
     { 
      using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) 
      { 
       byte[] bb = sha1.ComputeHash(Encoding.UTF8.GetBytes(salt + plainText + plainText)); 
       return Convert.ToBase64String(bb); 
      } 
     } 

2) Shop Base64-String in SQLserver VARCHAR

3) Speichern des Salzes in ein anderes Feld mit dem Hash. Salz als einfacher Text.

4) Nicht sicher, was Sie meinen. Wenn Sie OpenId verwenden, müssen Sie keine Kennwörter speichern.

0

Hash & salt werden verwendet, um die Sicherheit Ihrer Benutzer zu gewährleisten. MD5-Hash ist der am häufigsten verwendete Algorithmus.Hash-Funktionen sind irreversibel -> Sie können nicht das Passwort aus dem Hash erhalten, aber jemand dachte irgendwo - hey! Lassen Sie uns eine Tabelle generieren, die Beispielpasswörter und ihre Hashes enthält, sortieren Sie diese und führen Sie eine einfache Suche durch, um das Passwort zu überprüfen. Aus diesem Grund wurde Salz eingeführt - Salz wird zum Benutzerpasswort hinzugefügt und dann hashed. Salt wird nach dem Zufallsprinzip erzeugt und sollte daher für jeden Hash in der Datenbank gespeichert werden.

Für die Details der Implementierung schlage ich vor, Sie betrachten Live-Beispiele wie NOPCommerce, die Open-Source-E-Commerce-Lösung ist. http://www.nopcommerce.com

(dies ist sehr nützlich, weil es einen benutzerdefinierten Mitgliedschaftsanbieter implementiert hat, die die Ideen von Salz & Hash verwendet)

0

Wie Hash ich eine Zeichenfolge mit C#?

einen Blick hier nehmen: http://support.microsoft.com/kb/307020

Was die Felddeklaration MSSQL-Typ sein würde? nvarchar (64)?

Es ist Binärdaten. Vielleicht möchten Sie es als String formatieren, aber das ist "extra Arbeit"

Was ist Salzen und muss ich das irgendwo in meiner Datenbank speichern?

Sie sollten ein einzelnes Salz pro Eintrag verwenden. Das Salz ist da, um es unmöglich zu wissen, ob 2-mal das gleiche Passwort verwendet wurde. normalerweise wird eine Leiste aus 2 Komponenten aufgebaut ... Ein "geteiltes Geheimnis" (muss komplex sein, damit es Nachschlagelisten besiegen kann) und ein eindeutiger Teil (zum Beispiel ein ID-Wert des Benutzers in der Datenbank oder etwas anderes. machen ... Sie sicher, dass „shared“ + „Unique“ + Passwort ist einzigartig

Wenn ich die Absicht, Menschen Facebook Connect verwenden zu lassen, muss ich über das Erstellen eines Hash/Salz kümmern?

Wenn Sie kann eine API von Drittanbietern verwenden, dann müssen Sie sich nicht um Hashing-Salting kümmern.Solange Sie nicht die Passwörter speichern, gibt es keine Notwendigkeit zu Hash. Hashing ist eine Einweg-Funktion, so gibt es keine "gute" Art und Weise (Tipp : Rainbow-Tabellen), um das ursprüngliche Passwort zu rekonstruieren Wenn Sie Facebook die Authentifizierung überlassen haben, müssen Sie sich nicht um all diese grundlegenden Klempner kümmern, da Sie nicht s sind zerriss die Passwörter.

Hashing wird verwendet, wenn Sie einige Informationen so sicher haben möchten, dass sogar jemand, der Ihre DB stiehlt, nicht darauf zugreifen kann. BTW: Das schließt sich selbst ein ... Es gibt keine Möglichkeit, das ursprüngliche Passwort wiederherzustellen ...

+0

Das Salz sollte eine neu generierte zufällige Zeichenfolge sein. Nehmen Sie nicht die Benutzer-ID mit, es fügt keine Sicherheit hinzu und macht Ihren Code nur komplexer. –

+0

Wenn Sie die Benutzer-ID hinzufügen, können Sie einen geheimen Schlüssel anstelle eines zufällig generierten für jeden Benutzer verwenden. Dadurch können Sie das Speichern des Salzes selbst auf dem Datensatz überspringen. Das Hauptziel eines Salzes ist es, Ihre Passwort-Zeichenkette vor dem Hashing einzigartig zu machen. Ich mag auch, dass der potentielle Angreifer keinen Zugriff auf alle Informationen erhält, wenn er die Datenbank bekommt ... –