PassCalc: Der Passwort-Berechner

Es hat mich schon lange genervt: Wie kriegt man es hin, sichere Passwörter zu verwenden und sich diese trotzdem noch merken zu können? Es gibt da mehrere Ansätze, die man verfolgen kann. Alle mir bekannten Systeme haben jedoch die Schwäche, dass man weitere Passwörter erraten kann, sobald man das eigentliche System verstanden hat. Das ganze kann man noch dadurch erschweren, indem man ein festes - möglichst sicheres - Passwort an den Anfang setzt: Doch sobald das Passwort bekannt ist (z.B. weil eine Passwort-Datenbank gehackt wurde), ist auch dieser Schutz ausgehebelt.

Aus diesem Grund habe ich mich gestern Abend mal dran gesetzt und einen Passwort-Berechner programmiert. Die Idee dahinter ist relativ simpel: Man entscheidet sich für ein festes Passwort (oder auch mehrere, wenn man paranoid ist). Zudem wählt man für jeden Login, der einem so begegnet eine Information. Diese kann z.B. der Domainname, der verwendete Loginname, irgendwelche Kurzformen oder ähnliches sein. Diese Information wird nun genommen und mit dem gewählten Passwort verschlüsselt. Dabei heraus kommt eine neue Information, die möglichst den Anforderungen für ein sicheres Passwort entsprechen sollte.
Sollte dieses generierte Passwort nun bekannt werden, entstehen keinerlei Probleme für alle anderen passwortgeschützten Dienste die man nutzt, da aus dem gestohlenen Passwort nicht das ursprüngliche Passwort wiederhergestellt werden kann, um weitere Passwörter zu erraten.

Für alle, die es technisch mögen, gibt es hier noch eine Erläuterung, was nun genau mit den eingegebenen Daten passiert. Ich muss zugeben, dass meine Variante, die Sonderzeichen zu behandeln, ziemlich einfach gestrickt ist. Aber für meine Bedürfnisse war es so ausreichend.

1
2
3
4
5
6
7
8
9
10
11
  Temp_Information = ""
  while (LengthOf(Temp_Information) < 128) do
    Temp_Information = Temp_Information + MD5Hash(Base64Encode(Information))

  Temp_Passwort = ""
  while (LengthOf(Temp_Passwort) < 128)
    Temp_Passwort = Temp_Passwort + MD5Hash(Base64Encode(Passwort))

  Temp_Ergebnis = Base64Encode(AESEncrypt(Temp_Passwort, Temp_Information))

  Ergebnis = HandleSpecialChars(Temp_Ergebnis)

Wenn wir nun beispielsweise das Passwort "test" benutzen, und die Information "test1" wählen, erhalten wir (bei Deaktivierung der Sonderzeichen) folgendes Passwort:

1
QVNxTopIHJqEJnHKuNaaREFTcU6KSByahCZxyrjWmkRBU3FOikgcmoQmccq41ppEQVNxTopIHJqEJnHKuNaaREFTcU6KSByahCZxyrjWmkRBU3FOikgcmoQmccq41ppEQVNxTopIHJqEJnHKuNaaREFTcU6KSByahCZxyrjWmkQ=

Wählen wir hingegen als Information den Text "test2", erhalten wir dieses Passwort:

1
mgmuAX7honvsg1e9500r9ZoJrgF04aJ77INXveftK0WaCa4BfuGie0yDV73n7Sv1mgmuAX7honvsg1e9500r9ZoJrgF04aJ77INXveftK0WaCa4BfuGie0yDV73n7Sv1mgmuAX7honvsg1e9500r9ZoJrgF04aJ77INXveftK0U=

Ihr habt am Ende wahrscheinlich das "=". Das ist ein Überbleibsel der Base64-Encodierung, die ich übersehen habe. Dieses werde ich in einer zukünftigen Version eventuell noch beseitigen - rein aus Konsistenzgründen (keine Sonderzeichen halt).

Was angemerkt werden sollte: Im Gegensatz zu zufällig generierten Passwörtern, sind die mit diesem Programm generierten Passwörter reproduzierbar - genau darin liegt der Sinn in dem Ganzen. Die "Zufälligkeit" der schlussendlich generierten Passwörter basiert primär auf der Entropie, die durch den MD5-Hash und durch die AES-Verschlüsselung erzeugt wird.

Wie immer könnt ihr natürlich sowohl die kompilierte Binärversion, als auch den Quelltext herunterladen. Da ich für die AES-Verschlüsselung Martin Offenwangers GPL-lizensierte Klasse verwendet habe, steht natürlich auch diese Anwendung unter der GPL.

Was haltet iht von dem Programm? Wie wählt ihr sichere Passwörter für die unzähligen Webdienste aus? Habt ihr irgendein spezielles System? Falls ja: Wären andere Dienste gefährdet, wenn man eurer System herausfindet? Würdet ihr euch für die Passwort-Generierung auf ein Programm verlassen wollen?

Zum Schluss noch etwas Rechtliches:
Der Autor dieses Programms haftet nicht für Schäden an Soft- oder Hardware oder Vermögensschäden, die durch das Benutzen des Programms entstehen, es sei denn, diese beruhen auf einem grob fahrlässigen oder vorsätzlichen Handeln des Autors, seiner Erfüllungsgehilfen oder seiner gesetzlichen Vertreter.
Berechnende Grüße, Kenny

5 Kommentare » Schreibe einen Kommentar

  1. ob AES oder DES, es sind nur symetrische verschlüsselungsalgorithmen, die bei identischen ausgangswerten immer den selben hash erzeugen.
    somit kein entropie-zuwachs.

    • Ehrlich gesagt kann ich mir nicht vorstellen, dass wir so sehr aneinander vorbei reden, dass du mir diese Aussage vorsetzt. Eventuell solltest du trotzdem nochmal durchlesen, was die Entropie aussagt. Und wenn du mir dann immernoch sagen möchtest, dass durch das Hashen und die Verschlüsselung nicht dafür gesorgt wird, dass die Vorhersage weiterer Zeichen des Passwortes erschwert wird, bin ich gerne zu einer weiterführenden Diskussion bereit.
      Die bedingte Entropie ist hier vielleicht auch noch ein Schlagwort, das interessant für dich sein könnte.

      Und ganz weit ab vom Thema: Durch AES und DES werden keine Hashes erzeugten, sondern Chiffren.

    • Da ich mal wieder hier gelandet bin, wollte ich nochmal ein bisschen mehr ausholen. Viele Cipher eignen sich als Pseudo-Random-Number-Generators. Das heißt: Unter der Prämisse, dass sie mit einem zufälligen Seed befüttert werden, erzeugen sie daraus Zahlenfolgen, die von Zufallszahlenfolgen nicht zu unterscheiden sind.

      Im Zuge der Auswahl des AES-Verfahrens wurden sogar Zufallsanalysen der einzelnen Kandidaten (inkl. Rijndael aka. AES) durchgeführt. Das Ergebnis des NIST kann man online nachlesen. Die Aussage: Man kann anhand der durchgeführten Tests den Output von AES nicht von Zufallszahlen unterscheiden. Damit liefert AES einen Output-Stream mit hoher Entropie.

  2. du erzeugst keine zusätzliche entropie allein dadurch, dass du nur md5 und base64 beliebig oft wiederverwendest (siehe hierzu: Kryptologie).

    • Hast du jetzt absichtlich unterschlagen, dass ich explizit die Entropie-Erzeugung durch Nutzung der (sogar verlinkten) AES-Verschlüsselung erwähnt habe? Nebenbei: Doch, ich behaupte auch weiterhin, dass ich durch Verwendung von MD5 Entropie erzeuge.

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.