Ein einfacher Password Manager in C. Das Projekt ist als Übungsprojekt entstanden, um mehr praktische Erfahrung mit C, dynamischen Datenstrukturen und manueller Speicherverwaltung zu sammeln.
Der Fokus liegt nicht darauf, einen produktionsreifen Password Manager zu bauen. Wichtiger sind hier saubere interne Strukturen, klare Ownership-Regeln und ein bewusster Umgang mit Speicher.
Der Password Manager verwaltet Einträge mit Zugangsdaten und stellt dafür eine einfache terminalbasierte Oberfläche bereit.
Aktuell umfasst das Projekt:
- Erstellung und Verwaltung von Passwort-Einträgen
- dynamische Speicherung mehrerer Einträge
- einfache Suche
- formatierte Ausgabe im Terminal
- grundlegende Menüführung
- Passwort-Ablaufwarnungen
- bewusstes Freigeben von Speicher
Das Projekt habe ich gemeinsam mit einem Kollegen angefangen. Die Aufteilung war grob so, dass ich mich vor allem um die internen Datenstrukturen gekümmert habe, während mein Kollege stärker am User Interface und der Bedienung gearbeitet hat.
Mein Schwerpunkt lag auf:
entry.c / entry.hdatabase.c / database.h- Speicherverwaltung
- Ownership der Daten
- dynamische Verwaltung der Einträge
Der UI-Teil wurde gemeinsam abgestimmt, die konkrete Umsetzung der Bedienoberfläche lag aber hauptsächlich bei meinem Kollegen.
Das Entry-Modul ist für einzelne Passwort-Einträge zuständig.
Ein Entry verwaltet seine eigenen Daten und übernimmt die Verantwortung für den Speicher der enthaltenen Strings. Extern übergebene Werte werden intern kopiert, damit keine unklare Ownership entsteht.
Enthaltene Funktionen und Eigenschaften:
- Erstellen und Freigeben von Passwort-Einträgen
- interne Kopie aller relevanten Felder
- klare Ownership: jeder Eintrag verwaltet seinen eigenen Speicher
- explizites Überschreiben von Passwörtern vor dem Freigeben
- Zeitstempel für letzte Änderungen
- Zeitstempel für Passwortänderungen
Das Database-Modul verwaltet mehrere Entries über ein dynamisches Array von Entry-Pointern.
Die Kapazität wird bei Bedarf vergrößert, ohne bei jedem neuen Eintrag neu zu allokieren. Dadurch bleibt die Struktur einfach, aber trotzdem effizient genug für das Projekt.
Implementierte Funktionen:
database_createdatabase_freedb_add_entryget_entrydb_remove_entry
Wichtige Punkte:
- dynamisches Array von Entry-Pointern
- Kapazität wird bei Bedarf verdoppelt
- keine unnötige Reallocation bei jeder Einfügung
- Bounds Checking bei Zugriffen
- Freigabe aller enthaltenen Entries beim Löschen der Datenbank
- Vermeidung von Undefined Behavior im normalen Gebrauch
Das User-Interface stellt eine einfache Bedienung über das Terminal bereit.
Es ist bewusst schlicht gehalten und dient vor allem dazu, die Datenstrukturen praktisch nutzen zu können.
Aktuell enthalten:
- terminalbasierte Oberfläche
- einfaches Login-System
- interaktive Menüführung
- formatierte Ausgabe gespeicherter Einträge
- Suche nach Einträgen
- case-insensitive Suchfunktion
- Warnungen bei ablaufenden oder alten Passwörtern
Bei diesem Projekt ging es hauptsächlich darum, C sauberer und bewusster zu verwenden.
Wichtige Themen waren:
- manuelle Speicherverwaltung
- Heap-Allokation und korrektes Freigeben
- klare Ownership von Daten
- dynamische Datenstrukturen
- Trennung von Verantwortlichkeiten zwischen Entry, Database und Interface
- Vermeidung von Undefined Behavior
- erster Umgang mit sensiblen Daten im Speicher
Besonders interessant war für mich hier, wie schnell in C kleine Fehler bei Ownership oder Freigabe zu größeren Problemen führen können. Deshalb war ein Ziel, die einzelnen Module so zu strukturieren, dass klar ist, wer welchen Speicher besitzt und wann dieser freigegeben wird.
Das Projekt ist aktuell nicht sicher genug für echten Einsatz. Einige wichtige Dinge fehlen bewusst noch oder sind nur sehr einfach umgesetzt:
- keine Verschlüsselung
- keine sichere Schlüsselverwaltung
- Daten werden nicht dauerhaft gespeichert
- noch keine Save/Load-Funktionalität
- eingeschränkte Eingabevalidierung
- keine automatisierten Tests
- Sicherheitsaspekte sind nicht produktionsreif
Dieses Projekt ist nur zu Lernzwecken gedacht. Es ist nicht für die echte Verwaltung von Passwörtern geeignet, insbesondere weil Verschlüsselung, sichere Speicherung und Key Management fehlen.
Beispielhafter Build-Befehl:
gcc -Wall -Wextra entry.c database.c user_interface.c main.c -o password_managerDanach kann das Programm gestartet werden mit:
./password_managerDas Projekt war für mich eine gute Möglichkeit, C nicht nur theoretisch zu verwenden, sondern typische Probleme direkt praktisch zu sehen: Speicher reservieren, Speicher freigeben, Datenstrukturen wachsen lassen, Pointer korrekt behandeln und Zuständigkeiten zwischen Modulen klar halten.
Gerade weil C einem wenig abnimmt, eignet sich so ein Projekt gut, um ein besseres Gefühl für Speicher, Ownership und saubere Schnittstellen zu bekommen.