Passwortgenerator und -speicher (C++)

Aus C++_PHP_und_mehr
Wechseln zu: Navigation, Suche

Als moderner Mensch kann man vieles Online beschaffen oder erledigen. Aber für alles braucht man ein Passwort, und dieses Passwort sollte nur mit großen Aufwand geknackt werden können. Das bedeutet eine willkürliche Folge von Zahlen, Groß- und Kleinbuchstaben, am besten mit Sonderzeichen, um so länger, um so besser. Und natürlich für jede Website ein anderes Passwort[1]. Aber wer kann sich schon so viele verschiedene Passwörter ausdenken oder merken. Und aufschreiben ist auch riskant. Deshalb habe ich ein kleines Programm Namens PWCrypt geschrieben, das ein zufälliges Passwort erzeugt und mit einem Nutzername unter einem Stichwort abspeichert. Die Speicherdatei wird mit einem Master-Passwort durch GnuPG symmetrisch verschlüsselt[2]

Funktionen

  • Erzeugung eines zufälligen Passworts mit oder ohne Sonderzeichen. Voreinstellung ohne.
  • Oder Eingabe eines bereits bestehenden Passworts.
  • Jedem Passwort wird vom Anwender eine Kennung zugeordnet, unter der man es wiederfindet.
  • Mit jedem Passwort ist ein Nutzer gespeichert, vom Anwender einzugeben.
  • Speicherung des Passworts in eine verschlüsselten Datei. Voreingestellter Dateiname passwort.txt.gpg.
  • Symmetrische Verschlüsselung der Passwortdatei durch ein Masterpasswort aus beliebigen Zeichen (außer " oder Leerzeichen).
  • Anzeigen eines Passworts durch Angabe der Kennung.
  • Anzeigen aller Passwörter.
  • Löschen eines Passworts.

Speicherdatei

Jede Zeile in der Speicherdatei repräsentiert ein Passwort und besteht aus 3 mit '\t' getrennten Spalten:

PasswortindexKennung für das Passwort, dient zum Wiederauffinden. Passwortindex sollte eindeutig sein, sonst wird immer das 1. Auftreten gezeigt.
NutzerÜblicherweise gehört zu einem Passwort auch ein Benutzer, zB. logins bestehen meistens aus 2 Feldern.
PasswortEine zufällige Folge von Zeichen einstellbarer Länge, falls gewünscht auch mit Sonderzeichen.

Gebrauch

Es handelt sich um ein reines C++-Programm, dh. es läuft auf der Konsole ohne grafische Oberfläche (Windows:Eingabeaufforderung, Linux:Terminal).

Der Schlüssel Passwortindex wird als (letztes) Argument beim Aufruf übergeben, davor sind diverse Optionen möglich.
Ohne Optionen wird die Passwortzeile mit dem Schlüssel Passwortindex ausgegeben.

Aufruf
PWCrypt [Options] Passwortindex
PWCrypt --entfernen Passwortindex
PWCrypt -a

Optionen
-?Ausgabe dieses Textes.
-1Verwendet GnuPG Version 1.4 (gpg). Voreinstellung ist Version 2.x (gpg2).
-aZeigt alle Passwortzeilen in der Datei an.
-dNeue Passwortzeile mit Defaulteinstellung und dem Index Passwortindex.
--entfernenEntfernt alle Passwortzeilen mit der Kennung Passwortindex.
-f <file>Gibt den Namen der unverschlüsselten Datei an, wenn -f fehlt, wird die Voreinstellung DEFAULT_DATEI verwendet.
-hAusgabe dieses Textes.
-n <number>Neue Passwortzeile mit <number> Zeichen als Passwort. Voreinstellung DEFAULT_NUMBER.
-pNeue Passwortzeile mit abgefragten Passwort statt zufälligem Wert.
-rLiest das Passwort mit dem Index Passwortindex.
-sNeue Passwortzeile auch mit Sonderzeichen, Voreinstellung ohne.
-u <user>Neue Passwortzeile mit <user> für die Spalte Nutzer, Voreinstellung Login-Name.
-vGibt die Versionsnummer aus.

Das Master-Passwort wird in Klartext angezeigt. Das habe ich ganz bewusst so realisiert:

  1. Das Master-Passwort muss lang und kompliziert sein und kann beliebige Zeichen (außer " oder Leerzeichen) enthalten[3]. Somit sind Tippfehler wahrscheinlich[4].
  2. Wo steht schon einer hinter einem und filmt den Bildschirm. Außerdem könnte er dann auch die Tastenanschläge filmen.

Installation

Es ist reiner C++-Code und kann unter Windows und Linux[5] erstellt werden. Das Programm wurde mit der integrierten Entwicklungsumgebung Qt Creator erstellt und ausgetestet, es sind aber nur die Basiswerkzeuge Compiler und Linker notwendig. Dafür ist ein einfaches Makefile für Gnu make beigefügt.
Nach der Erstellung kann es sofort verwendet werden, es sind keine Einstellungen in einer Datei oder der Registry notwendig. Die Voreinstellungen DEFAULT_... sind als Konstanten in eigenschaften.h abgelegt und können vor dem Compilieren an die eigenen Bedürfnisse angepasst werden.

Quellcode

Die notwendigen Dateien findet man unter Quellcode von PWCrypt.
Außerdem gibt es eine mit Doxygen erstellte Beschreibung des Programms unter Dokumentation zu PWCrypt.

Linux

Auf jedem Linux-System steht für die Programmerstellung normalerweise eine GNU-C++ Toolchain zur Verfügung, bzw. ist leicht nachrüstbar[6].
Einfach im Source-Ordner (mit dem Makefile) im Terminal make eingeben.
In den meisten Distributionen ist GnuPG 1.4 oder GnuPG 2.x oder beide vorinstalliert.

Windows

Unter MS-Windows ist die Sache irgendwie komplizierter: Im QtCreator wird normalerweise die vorkompilierte Umgebung als DLLs dynamisch eingebunden, die DLLs muss man in den Ordner mit dem Programm kopieren, sie befinden sich irgendwo unter dem Qt-Ordner C:\Qt[7]. Besser ist es, den Makefile zu nutzen: in der Eingabeaufforderung genau wie unter Linux ein make[8] aufrufen. Ich habe mit Qt den MinGW-Compiler installiert, für QT5.2 mit Default-Einstellungen ist das Make-Tool C:\Qt\Tools\mingw48_32\bin\mingw32-make.exe. Aber man muss auch den Ordner in PATH[9] mit aufnehmen, da das Make-Tool Compiler und Linker aus diesem Ordner aufruft. [10]
GnuPG 1.4 für Windows findet man hier.

Binaries

Für diejenigen, die dieses lebensnotwendige Programm nutzen möchten, ohne sich mit C++ auseinanderzusetzen - was schade ist, da sich dieses Wiki um C++ dreht - zur Bequemlichkeit die erstellten Programme:
Linux.
Windows_7.

Fußnoten

  1. Es kommt schon vor, dass bei Anbietern Listen mit Passwörtern gestohlen werden. Um den Schaden zu begrenzen, darf das Passwort nicht auch noch woanders einen Zugang gewähren.
  2. Firefox bietet mit dem Master-Passwort eine ähnliche Funktionalität, aber nur für Websites, und auch nicht für alle. Und man muss sich das Passwort immer noch selbst ausdenken.
  3. Wenn man die Passwortdatei unter Windows und Linux nutzen will, sollte man die unterschiedliche Zeichensätze in Terminal bzw. Eingabeaufforderung berücksichtigen. Am besten beschränkt man sich auf ASCII-Zeichen, das sind über 90 Zeichen inklusive aller Satzzeichen und Klammern. Außerdem musste ich feststellen, dass das Apostroph unter Windows nicht die klammernde Bedeutung hat wie unter Linux.
  4. Generell finde ich es extrem lästig, das Passwörter verdeckt eingegeben werden. Das macht sichere Passwörter - also lange, zufällige Zeichenfolgen - fast unmöglich.
  5. Wahrscheinlich unter jedem Betriebssystem.
  6. Unter Ubuntu werden die Werkzeuge nicht automatisch mit installiert: Installation der Gnu C++-Entwicklungswerkzeuge
  7. Esgibt auch eine Möglichkeit, statische Libraries einzubinden, aber das erfordert zusätzlichen Aufwand, siehe Statisches Qt
  8. Ich muss zu meiner Schande gestehen, dass ich nur Erfahrung mit GNUmake habe. Unter Visual C++ ist wahrscheinlich alles anders. Aber ich verwende QtCreator + MinGW.
  9. Eine dauerhafte Änderung unter W7 ist nur über Systemsteuerung->System->Erweiterte Systemeinstellung->Register Erweitert->Umgebungsvariablen->Systemvariablen->Path möglich.
  10. Erstaunlicherweise ist das Programm bei Erstellung mit QtCreator unter Verwendung von DLLs unter Window 7 fast doppelt so groß (dazu kommen noch die nicht gerade kleinen DLLs) wie unter Linux mit eingebundenen Libs. Unter Windows 7 mit mingw32-make ist es 3 mal so groß wie unter Linux, bei Verwendung von statischen Qt 15 mal so groß.