jb_alvarado schrieb:
Ich denke schon, dass man je nach Anwendungsfall auch zwischen sicher und komfortabel abwägen kann und danach dann entwickelt.
Ich hab das relevante Wort mal hervorgehoben. Von abwägen hast du bisher kein Wort gesagt, sondern einzig von "sicher". Und "sicher" kann man nicht. Daran zerbrechen sich seit
Jahrzehnten Menschen den Kopf und
keiner bekommt es hin (weil es prinzipiell nicht geht). Bspw. Passwortmanager sind auch nur ein Kompromiss. Nicht umsonst gibt es jetzt den drölfzigsten Ansatz mit Passkeys um Passwörter "obsolet" machen zu wollen. Passkeys haben aber andere Schwächen, deutlich eklatantere als Passwortmanager imho.
jb_alvarado schrieb:
Wenn du mir dazu ein Rust Modul empfehlen kannst, nehme ich das sehr gerne.
Keine Ahnung, kenne mich in Rust viel zu wenig aus. Aber du brauchst kein "Modul" dafür (abseits von der Verschlüsselung und dem Hashen), du musst den Prozess korrekt abbilden und die Daten korrekt vorbereiten. Wie du eine Schleife baust. Dafür gibts kein Modul, das ist der übliche Prozess. "Einfache Kryptographie" existiert nicht. Und wenn ist sie immer anfällig.
jb_alvarado schrieb:
Was macht dann z.B. KeyPass mit dem Anmeldepasswort? Wie wird das entschlüsselt und verglichen?
KeePass fragt bei jedem Start das Master-Passwort ab. Das wird
nirgendwo hinterlegt, das musst du bei jedem Aufruf neu eingeben. Du kannst dich hier auch weiterhin ans OS heften und davon bereitgestellten APIs und Credential Manager verwenden. Das ist aber auch Aufwand den du treiben musst, ggf. crossplatform.
KeePass nutzt zusätzlich die vom OS bereitgestellte DPAPI um u.a. das Master-Passwort im RAM zu halten. Hier wird vom System die Sicherheit bereitgestellt und nicht durch dich. Aber auch diese kann man prinzipiell umgehen (siehe
DataProtectionDecryptor)...
jb_alvarado schrieb:
Wäre kein Problem, dann kann der Client einfach wieder neu sein API Key eingeben.
Hm nein... Nur weil du mit jedem Release deinen
öffentlichen Encryption Key änderst (den man problemlos aus der Binary auslesen kann
*hust*
), will der User deswegen nicht permanent seine Zugangsdaten neu eingeben. Ein API Key ist auch nur mehr ein Shared Key, den mindestens beide Gegenstellen kennen.
jb_alvarado schrieb:
Der Unterschied ist, dass der Code einsehr bar sein kann, ohne den Schlüssel preis zu geben.
Dein Schlüssel wird mit jedem Kompilat
direkt in der Datei weitergegeben. Du kannst den Schlüssel nicht "nicht preisgeben", um ihn dann irgendwo doch zu verwenden.
Security through Obscurity ist immer dumm und fällt dir immer auf die Füße. -> Schlüssel unter der Fußmatte
Und genau das machst du hiermit. Siehe auch Tools wie
WebBrowserPassView und
Mail PassView.
jb_alvarado schrieb:
Das ist, soviel ich weiß, von
kimai nicht vorgesehen.
Dann nutz auch die Funktion der API Keys. Diese Shared Keys sind vom Prinzip her nicht sicher, weil mindestens zwei Geräte diese kennen und auch prinzipiell jeder kennt, der den Traffic mitschneidet (außer du verwendest TLS zur Transportverschlüsselung, außer du verwendest auch nen "Virenscanner", welcher TLS aufbricht oder dann den Key zur "Überwachung" im Dateisystem durchleuchtet). Spätestens dann ist es aber auf deinem Gerät wieder unverschlüsselt. API Keys muss man auch nicht verschlüsseln, denn diese kann man bei einer ggf. Kompromittierung einfach rotieren (was bei Passwörtern schlechter geht).
Du kannst prinzipiell jeden API Key aus deinem Browser auslesen, wenn dir danach ist. Diese liegen auch unverschlüsselt vor, entweder Cookie oder im Local Storage direkt im Dateisystem.
FileZilla und Konsorten speichern ihre Zugänge auch ab. Aber nur in einem anderen Encoding, das man problemlos dekodieren kann. Ohne Master-Passwort ist auch hier nichts sicher. Einige speichern Zugangsdaten auch gern als Base64. Genauso sinnfrei - dem User täuscht man Sicherheit vor, dem Script-Kiddy ist das komplett egal.
Bestenfalls stellt man dich als inkompetent dar und überlegt sich zukünftig, ob man dir nochmal glaubt. Bei den heutigen Leaks ist das mit der Glaubwürdigkeit und dem Vertrauen allerdings etwas weit gehofft...
TL;DR:
- Sicher ist einzig ein Master-Passwort, was nur der User kennt. Das liegt zur Runtime aber temporär plain im RAM, aber persistiert wird es nirgendwo.
- Lass die "Verschlüsselung" sein und leg es so ab, weise den User ggf. darauf hin.
- Oder nutz Shared Keys (nicht sicherer als unverschlüsselt, aber einfacher rotierbar).
Im Falle von kimai, was eh schon API Keys verwendet, wäre letzteres die entsprechende Wahl.
Aber implementiere keine "Verschlüsselung" (auch nicht on top), die man beim nächsten Augenzwickern einfach brechen kann und lass den User nicht im Glauben, dass irgendwas "sicher" wäre.