11 Stimmen

Passwörter verschlüsseln

Ich habe eine Reihe von Fragen gelesen, in denen vorgeschlagen wird, Passwörter zu verschlüsseln und in der Datenbank zu speichern.

Wenn sich jemand anmeldet, verschlüsseln Sie das angegebene Passwort mit dem, was Sie gespeichert haben.

Was ich nicht verstehe, ist, wie das funktionieren kann? Zwei Zeichenketten können den gleichen Wert haben - nicht wahrscheinlich, aber definitiv möglich

Kann mir bitte jemand helfen?

EDIT: Kann jemand eine Statistik über die Kollisionswahrscheinlichkeit angeben?

0 Stimmen

Ich habe in meiner Antwort über den Geburtstagsangriff gesprochen: de.wikipedia.org/wiki/Geburtstag_Anschlag Sie gibt die Wahrscheinlichkeit einer Kollision angesichts der Anzahl der Versuche und der Anzahl der möglichen Hashes (basierend auf den Bits) an. Dies gilt für einen Brute-Force-Angriff. Die Wahrscheinlichkeit ist höher, wenn der Hash "geknackt" werden kann.

0 Stimmen

0 Stimmen

Vielleicht finden Sie meine Artikelserie zu diesem Thema interessant. blogs.msdn.com/ericlippert/archive/tags/Salt/default.aspx

1voto

Fitzchak Yitzchaki Punkte 8967

Eine gute Umsetzung dieser Idee.

  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;
  }

Fuente: http://davidhayden.com/blog/dave/archive/2004/02/16/157.aspx

0voto

Vanwaril Punkte 7030

Nehmen Sie zum Beispiel die md5-Hash-Zeichenkette - sie hat 128 Bits, das heißt, es können 2^128 verschiedene Hashes erzeugt werden. Selbst unter Berücksichtigung der Geburtstags-Paradoxon ist es höchst unwahrscheinlich dass eine Zeichenkette, die nicht das eigentliche Passwort ist, gefunden werden kann, um den Hashwert zu erzeugen (natürlich hat sich md5 als unsicher erwiesen, aber das ist ein anderes Thema, md5 ist nur ein Beispiel).

Angenommen, Sie haben ein Kennwort, das Programm hasst es und speichert den Hash in der Datenbank. Wenn Sie versuchen, sich anzumelden, wird das, was Sie eingeben, gehasht und mit diesem Hash verglichen - wenn Sie es erraten, besteht eine Chance von 1 zu 2^128, dass Sie richtig liegen. Das ist verschwindend gering, und das Passwort auf diese Weise zu hacken (Brute-Force) ist nicht machbar. Erhöht man die Anzahl der Bits, wird es tatsächlich unmöglich, es sei denn, der Hashing-Algorithmus kann zumindest teilweise zurückentwickelt werden.

0voto

TLiebe Punkte 7783

Mit einem geeigneten Hash-Algorithmus ist die Wahrscheinlichkeit einer Kollision äußerst gering. Solange Sie den Hashwert konsistent berechnen können, spielt es keine Rolle, ob zwei Zeichenfolgen zufällig denselben Hashwert haben (solange dies nicht sehr oft vorkommt). Sie vergleichen lediglich den Hash des Kennworts, das der Benutzer eingegeben hat, mit dem Hash, den Sie in der Datenbank gespeichert haben.

0voto

Mattl Punkte 1580

Wenn Sie einen SHA-512 mit einem anständigen Seed verwenden, ist es ziemlich unwahrscheinlich (aber nicht unmöglich), dass dies passiert.

Bruce Scheiner hat einige interessante Blogs über die Robustheit verschiedener Sicherheitstechniken geschrieben - sha1 gebrochen

Außerdem muss sichergestellt werden, dass zwei Benutzer mit demselben Kennwort nicht dasselbe Hash-Ergebnis in Ihrer Datenbank erhalten.

Um dies zu umgehen, könnten Sie einen Seed konstruieren, der ein benutzerspezifisches Feld wie das userid-Schlüsselfeld aus der Benutzertabelle enthält.

0voto

David Thornley Punkte 55244

Warum ist es wichtig, dass mehrere Zeichenfolgen denselben Hash-Wert ergeben? Jedes Mal, wenn der Benutzer sein Kennwort eingibt, wird es zum selben Wert gehasht, und damit wird der Benutzer authentifiziert. Die Eingabe eines beliebigen anderen Kennworts wird mit ziemlicher Sicherheit nicht mit dem gehashten Wert übereinstimmen. Wenn Sie eine gute Hash-Funktion verwenden, die einen 64-Bit-Wert liefert, stehen die Chancen, dass ein anderes Kennwort mit dem des Benutzers übereinstimmt, etwa fünfstellig zu eins.

Sie schützen sich davor, dass Insider die Kennwörter der Benutzer kopieren und die tatsächlichen Kennwörter preisgeben, wenn die Sicherheit verletzt und die Kennworttabelle kompromittiert wird. Die Standardtechnik besteht darin, dem Kennwort einige zusätzliche Bits hinzuzufügen (das Salt, das für jedes Konto unterschiedlich sein sollte) und eine starke Hash-Funktion zu verwenden.

Wenn Sie das tun, ist es sehr schwierig, ein Passwort zu finden, das einen bestimmten Hash ergibt, es sei denn, Sie probieren ein Passwort nach dem anderen, bis Sie das richtige gefunden haben. Hashing bietet auf diese Weise Schutz vor Insidern und Eindringlingen: Der Zugriff auf die Passworttabelle reicht nicht aus, um sich als jemand anderes anzumelden.

Es ist möglich, dass zwei Benutzer dasselbe Passwort haben oder (obwohl dies äußerst unwahrscheinlich ist) Passwörter, die denselben Hash-Wert ergeben. Mit dem Salt sehen sie in der Kennworttabelle nicht gleich aus, so dass kein Eindringling oder Insider durch einen Blick in die Tabelle erkennen kann, dass sein Kennwort mit dem eines anderen identisch ist.

Ein weiterer Vorteil ist, dass viele Menschen Passwörter wiederverwenden, insbesondere für Konten, die nicht sicher sein müssen. (Alle meine Konten mit Finanzdaten haben unterschiedliche und gute Passwörter, aber ich verwende dasselbe nicht so starke Passwort für verschiedene Foren.) Mit Salt und Hash ist es nicht möglich festzustellen, ob mein Kennwort auf Website A dasselbe ist wie auf Website B, selbst wenn beide Kennworttabellen vorhanden sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X