Gedanken zum Thema "Passwort speichern"

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Benutzeravatar
altmetaller
Beiträge: 22
Registriert: Do 12. Nov 2020, 15:04

Gedanken zum Thema "Passwort speichern"

Beitrag von altmetaller »

Hallo,

in meinem Programm hat der Anwender die Möglichkeit, ein Passwort für einen externen Dienst, genauer gesagt Zugangsdaten für einen SMTP-Server, zu hinterlegen. Dieses möchte ich gerne irgendwohin wegspeichern.

Das Passwort im Klartext in die Registry o.Ä. zu schreiben erscheint mir eher pragmatisch und entspricht auch irgendwie nicht meinem Sicherheitsdenken.

Er macht's mit Blowfish: Lazarus - How to quick and easy Encrypt and Decrypt text with BlowFish

Wäre das eurer Meinung nach angemessen / ausreichend? Oder kann ich mir das vielleicht sogar noch etwas einfacher machen?

Was mich etwas fuchsig macht ist der Umstand, dass der Schlüssel letztendlich ja auch "irgendwie" im Binary steht. Dazu hatte ich mir überlegt, ggf. die E-Mail-Adresse, den SMTP-Server o.Ä. als Key zu nutzen was dann nicht ganz so offensichtlich ist...

Bevor ich mich jetzt völlig verlaufe - was ist denn eure Meinung dazu?

Gruß,
Jörg

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von m.fuchs »

Bei derartiger Anmeldung an externen Diensten gibt es letztlich drei Möglichkeiten (also theoretisch noch mehr, aber dazu muss auch der externe Dienst mitspielen):
  1. Du speicherst die Zugangsdaten im Klartext. Ist halt unsicher, wenn ein Angriff auf den Speicher erfolgt.
    1. Ein Unterpunkt davon ist das "verschlüsselte" Speichern mit Rot13 o.Ä. sowie mit vernünftigen Algorithmen aber einem gespeicherten Schlüssel. Beides kann aus Sicherheitsaspekten wie Klartext gewertet werden.
  2. Der Nutzer gibt beim Start des Programms das Passwort für den Zugang ein. Kann halt mühselig sein, besonders wenn es mehr als ein Zugang ist.
  3. Du speicherst das Passwort/die Passwörter verschlüsselt und der Nutzer gibt bei Start deines Programms den Masterschlüssel ein. Ähnlich wie 2. aber mit dem Vorteil dass bei mehreren Zugängen nur ein Passwort eingegeben werden muss.
Mein Vorschlag: eine Kombination aus 1.a. und 3. Dann kann der Nutzer selber entscheiden wie sicher er es gerne hätte und du bist als Entwickler fein raus. Gängige Webbrowser fahren genau diese Strategie. Wenn du besonders nett bist (oder besonders paranoide Nutzer hast) kannst du zusätzlich noch 2. anbieten. Und Steigerungen davon (Verfall des Passworts aus dem Speicher nach x Minuten, bei jedem Abrufen das Passwort neu eingeben,...).
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von sstvmaster »

Also Firefox und Thunderbird verschlüsseln mit 3DES und einem Schlüssel aus der key3.db + base64, Filezilla "verschlüsselt" nur mit base64.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von Aidex »

Hi!
Die einzige sichere Möglichkeit ist die, wie in 3.) von m.fuchs beschrieben.
Dabei hat der Benutzer ein Programm-Passwort, das aber nicht mal das Programm kennt.

Um die SMTP-Anmeldedaten (inkl. SMTP-Passwort) zu speichern, muss der Benutzer ein Programm-Passwort festlegen/eingeben.
Dieses Programm-Passwort wird nicht gespeichert, so dass nur der Benutzer es kennt.
Mit dem Programm-Passwort werden alle Daten (z.B. SMTP-Anmeldedaten inkl. SMTP-Passwort) verschlüsselt und dann gespeichert.
Zusätzlich sollte zusammen mit den Daten ein Hash aller unverschlüsselten Daten gespeichert werden, siehe unten.

Um die Daten wieder laden und entschlüsseln zu können, muss der User sein Programm-Passwort wieder eingeben.
Ob das Passwort richtig ist, weiß das Programm in diesem Moment noch nicht.
Mit dem eingegebenen Passwort versucht das Programm, die gespeicherten Daten zu entschlüsseln.
Ob die Entschlüsselung gelungen ist, kann das Programm nur anhand des mitgespeicherten und mitver- und entschlüsselten Hashs verifizieren.

Möchte der Benutzer sein Programm-Passwort ändern, muss er zunächst das alte Passwort eingeben, um die Daten entschlüsseln zu können,
und dann ein neues PW, womit die Daten neu verschlüsselt und neu gespeichert werden.

Es ist zwar umständlich, dass der User ein Programm-Passwort benötigt, aber an dieser Methode ist sexy, dass im Programm selbst
kein festes Passwort, kein fester Schlüssel und keine festen Daten hinterlegt werden müssen - und es so sicher wie möglich ist.
Wenn der User allerdings sein PW vergisst, kann ihm niemand mehr helfen (außer Brute Force).

Benutzeravatar
altmetaller
Beiträge: 22
Registriert: Do 12. Nov 2020, 15:04

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von altmetaller »

Hallo,

ich hatte mir auch schon überlegt, das Passwort mit einem anderen Parameter zu verschlüsseln. Der Benutzer muss ja z.B. auch eine E-Mail-Adresse angeben, die man dann gleichzeitig als Schlüssel nutzen könnte.

Das gäbe Probleme, wenn der Anwender dann z.B. die E-Mail-Adresse in den Einstellungen ändert, ohne das Kennwort festzulegen. Dem könnte man wiederum entgegentreten, indem man das Passwortfeld konsequent leert, sobald die E-Mail-Adresse geändert wird und so eine Neueingabe erzwingt.

Das Verfahren wäre natürlich auch durch ein Reverse Engeneering oder schlichtweg durch brutales Herumprobieren ermittelbar. Aber es wäre halt nicht mehr ganz so offensichtlich wie ein Klartextkennwort im Binary und würde ein deutlich höheres Maß an Neugierde und krimineller Energie erfordern.

Gruß,
Jörg

PascalDragon
Beiträge: 829
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von PascalDragon »

altmetaller hat geschrieben:
Fr 8. Jan 2021, 12:33
ich hatte mir auch schon überlegt, das Passwort mit einem anderen Parameter zu verschlüsseln. Der Benutzer muss ja z.B. auch eine E-Mail-Adresse angeben, die man dann gleichzeitig als Schlüssel nutzen könnte.

Das gäbe Probleme, wenn der Anwender dann z.B. die E-Mail-Adresse in den Einstellungen ändert, ohne das Kennwort festzulegen. Dem könnte man wiederum entgegentreten, indem man das Passwortfeld konsequent leert, sobald die E-Mail-Adresse geändert wird und so eine Neueingabe erzwingt.
Du könntest ja auch einfach, wenn die E-Mail Adresse geändert wird, das Passwort neu verschlüsseln? Du hast ja als Programm sowohl den alten Schlüssel als auch den neuen.
altmetaller hat geschrieben:
Fr 8. Jan 2021, 12:33
Das Verfahren wäre natürlich auch durch ein Reverse Engeneering oder schlichtweg durch brutales Herumprobieren ermittelbar. Aber es wäre halt nicht mehr ganz so offensichtlich wie ein Klartextkennwort im Binary und würde ein deutlich höheres Maß an Neugierde und krimineller Energie erfordern.
Quasi alle Mechanismen, die ohne Masterpasswort des Nutzers auskommen kranken an solchen Problemen...
FPC Compiler Entwickler

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von Warf »

Im allgemeinen gilt wenn es um IT security geht, solltest du so arbeiten als ob ein angreifer zugang zu den Sourcen von deinem Programm hat.
Klar kannst du es etwas schwerer machen an daten zu kommen, aber letztendlich gibt es keine möglichkeit ein passwort auf einem rechner zu speichern ohne es mit einem weiteren passwort verschlüsseln muss. Und wenn du ein weiteres passwort abfragst, ist die frage ob das tatsächlich an sicherheit gewinnt, denn Nutzer und Passwörter sind immer so eine Sache. Die meisten Nutzer werden einfach das selbe passwort benutzen, weil die meisten Nutzer nur ein standard passwort haben. Hier gewinnst du nicht. Ein anderer fall ist, wenn das SMTP passwort z.b. durch Firmenpolicy sicher sein muss (z.b. zufallsgeneriert), kann es sogar sein das die Nutzer dann für dein Programm ihr Standardpasswort benutzen und somit effektiv weniger sicherheit haben. Eine andere option ist das du ein starkes passwort mit einem anderen starken passwort verschlüsselst, in dem Fall gewinnst du auch nix, verlierst aber wenigstens nix.
Die einzige situation in der sich so ein mechanismus lohnen würde ist wenn du mehrere *unterschiedliche* passwörter speichern musst, und der Nutzer ein starkes Passwort wählt.
Du kannst also solch einen mechanismus anbieten, ich würde ihn an deiner Stelle aber nicht zur pflicht machen, denn nur wenn die Nutzer auch wirklich sicherheitsbewusst sind, nutzt der überhaupt was. Ich würds also so mache, 3 optionen: Passwort nicht speichern, Passwort speichern, Passwort mit anderem Passwort verschlüsselt speichern. So ist für jeden was dabei.

Das gesagt ist die Frage wogegen du dich absichern willst. Wenn der Angreifer Zugriff auf deinen rechner hat, ist auch die verschlüsselung und das passwort egal, da du mit einem keylogger eh ziemlich schnell ran kommst. Mit exploits wie Meltdown können Anwendungen sogar den Speicher anderer Anwendungen auslesen, d.H. wenn du das passwort unverschlüsselt im speicher liegen hast kommt man auch da ran.
Im allgemeinen gilt, wenn ein Angreifer Prozesse auf deinem PC ausführen kann, hast du eigentlich schon längst verloren. Deshalb speichern programme wie Browser oder Mail Clienten deine Logindaten direkt unverschlüsselt, denn wenn jemand zugang zu diesen Dateien hat ists eh schon längst vorbei.
Meist wird eine simple konstante XOR verschlüsselung oder so benutzt damit man wenigstens die dateien nicht per klartextsuche finden kann, aber echte Sicherheit ist das nicht.

Eine alternative sind key storages wie z.B. vom MacOS betriebsystem implementiert. Hier können anwendungen ihre passwörter reinschreiben und auslesen, und wenn eine fremde anwendung versucht sie auszulesen braucht diese das Nutzerpasswort. Unter linux gibt es programme wie KWallet, die als systemweiter Passwortmanager fungieren, bei denen der Nutzer explizit ein Passwort angeben muss. Das lohnt sich zwar wenn es für praktisch alle programme auf dem system verwendet wird, aber wenn jedes programm seinen eigenen passwort manager mitbringt, der nur 1-2 passwörter managed, bringt das halt auch nicht viel.

Wovor du eigentlich schützen willst ist das unbefugte Nutzer (z.b. andere Accounts auf dem selben rechner, oder jemand mit hardware zugang zu der platte) an die daten kommt. Dafür verschlüsselt die MacOS Schlüsselverwaltung z.b. die Passwörter mit dem Nutzerpasswort, was natürlich nur geht weil das auf OS level implementiert wird. Unter Linux ist es für gewöhnlich auf multiuser Maschinen so eingerichtet, das das Nutzerverzeichnis verschlüsselt wird, sodass andere nutzer nicht drauf zugreifen können.
Auf meinem Laptop habe ich einfach die Partition komplett verschlüsselt (da nur ich das Teil benutze, und daher nur ein Nutzeraccount auf dem Gerät existiert) auf meinem Desktop aber benutz ich nix der gleichen, denn wenn jemand bei mir zuhause einbricht habe ich größere Sorgen als mein Email Passwort

Benutzeravatar
altmetaller
Beiträge: 22
Registriert: Do 12. Nov 2020, 15:04

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von altmetaller »

Hallo,

komme ich denn so einfach an den Key Storage von Windows?

Gruß,
Jörg

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von sstvmaster »

LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von Nimral »

Darf ich mich anhängen? Ich denke über ein ähnliches Problem nach.

Nehmen wir an, ich kann keinen (von einem Bneutzer-Passwort abgeleiteten) Key als Basis für die Verschlüsselung einer Datei verwenden, weil auf diese übers Netzwerk n Benutzer zugreifen sollen, und weil diese ihre Kennwörter nach Belieben ändern können sollen. Es muss also für die Verschlüsselung ein anderer Key her, der z.B. im Code eines Zugriffsprogramms versteckt, oder mit einem im Code des Zugriffsprogramms versteckten Schlüssel verschlüsselt im Netz abgelegt sein könnte. Das Zugriffsprogramm seinerseits würde eine Authentifizierung mittels Benutzername und Passwort verlangen, die Hashes der Passwörter würden im Netz gespeichert.

Sobald jemand den Quellcode des Programms in die Hände bekommt, ist die Datei natürlich auch ohne die Benutzerkennwörter lesen zu können ohne großen Aufwand lesbar. Den Key zusammensuchen ist nicht mal nötig, im einfachsten Fall baut man einfach den Login aus und kompilert das Programm neu.

Gibt es überhaupt einen Ausweg aus diesem Dilemma?

Armin.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von m.fuchs »

Du könntest einen Key verwenden für die Verschlüsselung der Dateien und dann diesen Key mit den Userpasswort verschlüsseln und für jeden User ablegen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
altmetaller
Beiträge: 22
Registriert: Do 12. Nov 2020, 15:04

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von altmetaller »

Hallo,

ich habe mich übrigens dahingehend entschieden, das Passwort per Blowfish mit einem "wie auch immer" gebildeten Schlüssel zu verschlüsseln. Dieser wird aus eher unverfänglichen Daten gebildet, welche ich ebenfalls "wegsichere" (die eingegebene E-Mail-Adresse, Hostname, MAC-Adresse o.Ä.). Sobald sich eines dieser Daten ändert, werde ich in der GUI eine Neueingabe des Kennwortes forcieren und das Passwort mit den neuen Daten verschlüsseln.

Meine Motivation ist eine weitreichende (Plattform-)Unabhängigkeit.

Zudem ist meine Anwendung "eher exotisch" und wird jetzt nicht unbedingt alle 2 Minuten genutzt, so dass das dem (technisch sehr versierten) Benutzer durchaus mal zuzumuten ist.

Allerdings fehlt mir im Moment auch "irgendwie" die Muße, das weiter zu verfolgen. Ich leide unter einer chronischen psychischen Erkrankung und habe da immer so Phasen, wo so etwas eine doppelte / dreifache Belastung für mich ist :-(

Gruß,
Jörg

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von Nimral »

m.fuchs hat geschrieben:
Do 11. Mär 2021, 13:02
Du könntest einen Key verwenden für die Verschlüsselung der Dateien und dann diesen Key mit den Userpasswort verschlüsseln und für jeden User ablegen.
Interessanter Gedanke! Ich lass mir das mal auf der Zunge zergehen, vom Gefühl her ist das der Weg den ich gehen könnte, allerdings mit einem Haken: der Datenbank-Key stirbt dann mit dem letzten Benutzerkonto. Muss mal drüber nachdenken, ob mich das irgendwie stören würde. Ich kann ihn natürlich exportierbar machen, und damit das Problem der sicheren Aufbewahrung an jemand anders delegieren. Ich glaube, der Weg gefällt mir. :-)

Und Dir, Jörg, wünsche ich gute Besserung. Ich kenn das mit Burn-Out bzw. Depressionen nur zu gut, ist eine teuflische Sache, aus der man nicht leicht heraus kommt.

HG aus Bayern, Armin.

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von Warf »

Du kannst ja ein "admin" konto haben das immer zugang zum key hat

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Gedanken zum Thema "Passwort speichern"

Beitrag von Timm Thaler »

Warf hat geschrieben:
Do 11. Mär 2021, 17:20
Du kannst ja ein "admin" konto haben das immer zugang zum key hat
Am besten mit hardgecodetem Passwort "12345". Hunderte von Programmieren die so von der IP-Kamera bis zum Solar-Wechselrichter "sicher" gemacht haben können nicht irren.

Antworten