[gelöst] Passwort im Programm verstecken

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

[gelöst] Passwort im Programm verstecken

Beitrag von hubblec4 »

Hi

Ich habe mit Google nicht das richtige gefunden.
Das beste war hier zu finden
viewtopic.php?f=12&t=13339
Allerdings trifft es nicht genau das was ich suche.

Mein Programm nutzt eine MySQL DB im Netz.
Um mit dieser zu kommunizieren bedarf es eines Passwortes welches ich beim Provider einrichten musste.

Bis jetzt hatte ich das Passwort recht ungeschützt(wie ich feststellen musste) einfach "hard gecodet".
An den Quellcode kommt keiner ran, aber man kann die .exe untersuchen und könnte fündig werden.

Was wäre hier die beste Vorgehensweise in Bezug auf Sicherheit?
Der Quellcode soll vielleicht mal öffentlich gemacht werden, und dann sollte da ja eigentlich auch gar nix mehr im Quellcode zu finden sein oder?

Sollte ich die Kommunikation mit der DB aus dem Programm auslagern?
Eine .dll oder so?
Zuletzt geändert von hubblec4 am Sa 7. Jan 2023, 17:48, insgesamt 1-mal geändert.

charlytango
Beiträge: 845
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Passwort im Programm verstecken

Beitrag von charlytango »

Nachdem ein Programm möglichst unabhängig von der angesprochenen Datenbank sein sollte was zb Zugangsdaten betrifft (ob andere DB-Typen möglich sein sollen sei mal dahingestellt) lege ich die Zugangsdaten in einer eigenen Textdatei beliebigen Formats (ich nutze einfach das INI-Format) ab die ich bei Programmstart bzw Verbindung zur DB einlese.

Kann man auch so gestalten dass man diese Datei irgendwie hübsch aus dem Programm aus anlegen bzw ändern kann etc.

Damit sind in deinem Sourcecode den du freigeben willst keinerlei Zugangsdaten zu irgendwelchen Datenbanken vorhanden und jeder User hat nur die Zugangsdaten zu "seiner" DB. Falls das deine Absicht ist kannst du hier aussteigen.

Bei erhöhtem Sicherheitsbedürfnis kannst du dafür sorgen dass die Datei mit den Zugangsdaten entsprechend verschlüsselt ist.

Den richtigen Forumsbeitrag hast du dafür ja schon gefunden.
Spontan fällt mir dazu Turbopower LockBox oder DCPcrypt aus dem OPM ein aber sicher gibt es auch noch andere Varianten und Komponenten die Verschlüsselung anbieten.

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Passwort im Programm verstecken

Beitrag von theo »

hubblec4 hat geschrieben:
Sa 3. Sep 2022, 00:34
Mein Programm nutzt eine MySQL DB im Netz.
Was macht es denn damit?
Gibt es z.B. eine Benutzerverwaltung, oder loggt/liest das nur ein paar Daten?
Je nachdem könnte man ein Script (z.B. PHP) dazwischen schalten und so die (Haupt-)Passwörter auf dem Server lassen.
Das Script könnte dann auch vieles unterbinden/herausfiltern, was nicht erlaubt sein soll.
Ich finde, es kommt schon darauf an, was es werden soll.
MySQL Zugriff direkt für das Internet zu öffnen (auch Firewall) ist ja eh nicht die beste Idee afaik.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Passwort im Programm verstecken

Beitrag von hubblec4 »

charlytango hat geschrieben:
Sa 3. Sep 2022, 09:14
Nachdem ein Programm möglichst unabhängig von der angesprochenen Datenbank sein sollte was zb Zugangsdaten betrifft (ob andere DB-Typen möglich sein sollen sei mal dahingestellt) lege ich die Zugangsdaten in einer eigenen Textdatei beliebigen Formats (ich nutze einfach das INI-Format) ab die ich bei Programmstart bzw Verbindung zur DB einlese.

Kann man auch so gestalten dass man diese Datei irgendwie hübsch aus dem Programm aus anlegen bzw ändern kann etc.

Damit sind in deinem Sourcecode den du freigeben willst keinerlei Zugangsdaten zu irgendwelchen Datenbanken vorhanden und jeder User hat nur die Zugangsdaten zu "seiner" DB. Falls das deine Absicht ist kannst du hier aussteigen.
Das verstehe ich nun mal gar nicht.
Wenn ich das Passwort für die DB in eine .INI schreibe dann kann ja gleich jeder User sofort in die INI schauen und hat das DB-Passwort.

Und wenn der User mal ausversehen die INI-Datei gelöscht hat wie soll diese wieder hergestellt werden? Dazu müsste dann ja auch alles im Code "vorbereitet" sein.
charlytango hat geschrieben:
Sa 3. Sep 2022, 09:14
Bei erhöhtem Sicherheitsbedürfnis kannst du dafür sorgen dass die Datei mit den Zugangsdaten entsprechend verschlüsselt ist.
Auch das ist immer noch das selbe finde ich. Egal ob verschlüsselt oder nicht, die Zugangsdaten stehen in der Datei und man hat ja dann alle Zeit der Welt die Datei zu untersuchen.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Passwort im Programm verstecken

Beitrag von hubblec4 »

theo hat geschrieben:
Sa 3. Sep 2022, 09:54
hubblec4 hat geschrieben:
Sa 3. Sep 2022, 00:34
Mein Programm nutzt eine MySQL DB im Netz.
Was macht es denn damit?
Hier der link zum Proggi.
https://gleitz.info/forum/index.php?thr ... /&pageNo=1

Es gibt im Proggi eine Kapiteldatenbank.
theo hat geschrieben:
Sa 3. Sep 2022, 09:54
Gibt es z.B. eine Benutzerverwaltung, oder loggt/liest das nur ein paar Daten?
Ja es können Benutzer sich einen Acc anlegen und dann bissl down- und uploaden und editieren.


theo hat geschrieben:
Sa 3. Sep 2022, 09:54
Je nachdem könnte man ein Script (z.B. PHP) dazwischen schalten und so die (Haupt-)Passwörter auf dem Server lassen.
Das Script könnte dann auch vieles unterbinden/herausfiltern, was nicht erlaubt sein soll.
Ich finde, es kommt schon darauf an, was es werden soll.
Es gibt nicht wirklich einen Server dahinter also so wie bei Webseiten. Ich habe nur die reine nackte SQL-DB.
Von daher keine Ahnung wo man da ein php-script zwischen schieben sollte.

theo hat geschrieben:
Sa 3. Sep 2022, 09:54
MySQL Zugriff direkt für das Internet zu öffnen (auch Firewall) ist ja eh nicht die beste Idee afaik.
Mmmh. OK, aber wie soll man sowas generell lösen?

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Passwort im Programm verstecken

Beitrag von theo »

Naja, es kommt auf deine Sicherheitsansprüche an. Ich bin kein Experte dafür.

Wenn es dir reicht, dein Passwort "ein bisschen" zu verschlüsseln, kannst du diesen Weg so gehen.

Wenn es sicherer sein soll, würde ich schauen, dass der Server möglichst wenig überhaupt zulässt.
Also ein Grossteil der Logik auf den Server verlegen und nur noch die nötigen Schnittstellen/Operationen zulassen.
Das kann bis zu einem Webservice gehen.
(Wo MySQL ist, ist meistens auch ein Apache und PHP. :wink: )

Wie gesagt, ich bin kein Experte dafür, vielleicht kommen noch kompetentere Vorschläge.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Passwort im Programm verstecken

Beitrag von hubblec4 »

Mit dem Webzeugs steh ich bissl auf Kriegsfuss :-)
und wie schon gesagt, es gibt auch keinen Server oder sowas, nur die reine nackte SQL-DB.


Meine Idee(n) war bis jetzt:
(1)
Ich hinterlege das PW schon in der Proggi.exe aber nicht mehr als hardcode, sondern als ultrakomplizierte Funktion, so dass man dann beim betrachten der Datei in einem Editor keinen "Text" mehr findet.

(2)
Ich bastel eine .dll zusammen welche mir das PW wie in (1) beschrieben erstellt.
Der Quellcode dieser .dll würde dann nicht veröffentlich werden.

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Passwort im Programm verstecken

Beitrag von theo »

Ich habe auf meinem Rechner ein Prog, wo die Passwörter in Inifiles stehen.
Damit man die nicht einfach ohne weiteres "mitlesen" kann, habe ich sie leicht verschlüsselt.
Das geht z.B. so:

Code: Alles auswählen

uses base64;

const
  XKey = 'Any?os898';
  PassWort = 'JhhTAxwYf1czGxQ=';

function XORCrypt(Data, Key: string): string;
var
  KeyLen: integer;
  i: integer;
begin
  KeyLen := Length(Key);
  for i := 1 to Length(Data) do
    Data[i] := Chr(Ord(Data[i]) xor Ord(Key[(i mod KeyLen) + 1]));
  Result := Data;
end;


{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  //Passwort verschlüsseln: EncodeStringBase64(XORCrypt('Irgend Ein PassWort', XKey));
  ShowMessage(XORCrypt(DecodeStringBase64(PassWort), XKey));
end;   
Ist natürlich kein Fort Knox, aber etwas besser als Klartext.
D.h. so bekommt niemand "zufällig" das Passwort mit.
Wenn jemand mit "krimineller Energie" rangeht, wird es sowieso schwieriger.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Passwort im Programm verstecken

Beitrag von hubblec4 »

ja das mit der "leichten" verschlüsselung ist machbar,
aber ich möchte auf keinen Fall das das DB-PW in eine INI kommt. Damit wäre es ja noch leichter zu finden.
So eine INI doppel-klickt man und kann sie sich anschauen.

Eine .exe Datei muss man schon anders als per doppelklick laden um sie anzuschauen.

Und es geht auch nicht um die PWs von den Benutzern, diese kann der Benutzer in der INI hinterlegen lassen um sie nicht dauernd eingeben zu müssen,

ABER eben nicht das DB-PW, das sollte wenns geht nirgends stehen....
klar, irgendwo muss es stehen, denn die SQL-Komponente die sich mit der DB verbindet brauch es ja nun mal.

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Passwort im Programm verstecken

Beitrag von theo »

Das Beispiel oben hat ja mit Inifiles nichts zu tun. Das PW steht ja in der const.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Passwort im Programm verstecken

Beitrag von hubblec4 »

theo hat geschrieben:
Sa 3. Sep 2022, 13:20
Das Beispiel oben hat ja mit Inifiles nichts zu tun. Das PW steht ja in der const.
Jo und das ist ganz besonders schlimm :-)

Ich habe mein PW sogar in drei Teile zerstückelt, alles als "const" und das ergebnis:
Öffne die .exe Datei in Notepad++ und liest direkt in Klartext das komplette PW.

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Passwort im Programm verstecken

Beitrag von theo »

Aber es ist in der Const ja verschlüsselt!
Verstehst du nicht?
Lass das doch mal laufen, dann siehst du, was dort wirklich steht.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Passwort im Programm verstecken

Beitrag von hubblec4 »

Naja, verstehen tu ich es schon. Man kann dann halt ein verschlüsseltes PW lesen.
Klar weis man nun nicht genau wie das eigentliche PW ist.
aber man kann schon mal direkt aus der .exe Datei das verschlüsselte PW auslesen ohne großen aufwand.
Zuletzt geändert von hubblec4 am Sa 3. Sep 2022, 13:39, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Passwort im Programm verstecken

Beitrag von theo »

Ja und?
Du kannst es ja zusätzlich noch zerstückeln, wenn du möchtest.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Passwort im Programm verstecken

Beitrag von hubblec4 »

das Zerstückeln bringt nix

Code: Alles auswählen

const 
PW1 = 'ab';
PW2 = 'xy';


DecodePW(PW1 + PW2);

nun steht in der .exe 'abxy';

Antworten