Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DB-Zugangsdaten verschlüsseln (https://www.delphipraxis.net/197605-db-zugangsdaten-verschluesseln.html)

Zacherl 24. Aug 2018 11:43

AW: DB-Zugangsdaten verschlüsseln
 
Zitat:

Zitat von mkinzler (Beitrag 1411534)
Ein Ablage verschlüsselt wäre deutlich besser/sicherer. Dies abzulehnen, da knackbar finde ich paradox!

Es ist eben NICHT sicherer, das ist doch grade das Problem. Diese "Sicherheit" ist ein Trugschluss. Als Analogie kannst du dir einmal deine offene Tür vorstellen und einmal eine verschlossene Tür, bei der der Schlüssel in einem offenen Safe davorliegt. Die Datei zu verschlüsseln, aber den Key in der Anwendung zu hinterlegen ist das klassische "security through obscurity" (Verschleierungs-)Prinzip, was nicht umsonst in der IT-Security eins der verpöntesten Prinzipien überhaupt ist :?

Zitat:

Zitat von ernschd (Beitrag 1411543)
Natürlich, aber mit der Schlüssel-Authentifizierung wird zumindest das Passwort nicht mehr benötigt.

Hier hast du doch das gleiche Problem. Ob nun jemand die Zugangsdaten unberechtigterweise klaut/anwendet, oder eben den Schlüssel ... Resultat ist das selbe: Unberechtigter Datenbankzugriff.

Zitat:

Zitat von Ykcim (Beitrag 1411544)
[...] Ich möchte die Zugriffsdaten einfach nicht mehr im Klartext da stehen haben...

Das müssen wir wohl akzeptieren. Dann hoffe ich mal für dich, dass dir das nicht irgendwann auf den Kopf fällt.

FrankR 24. Aug 2018 12:30

AW: DB-Zugangsdaten verschlüsseln
 
Zitat:

Zitat von Ykcim (Beitrag 1411544)
Also die Daten liegen auf einem MySQL DB Server, der nur innerhalb des Unternehmen erreichbar ist.
Innerhalb des Unternehmens greifen mehrere User auf das Programm und damit auch auf die Daten zu.

Heute ist es noch so, dass ich das Programm ebenfalls auf einen Server lege und die User eine Verknüpfung auf ihren Rechnern zu diesem Programm haben...

Ich möchte die Zugriffsdaten einfach nicht mehr im Klartext da stehen haben...

Vielen Dank für die rege Diskussion und Hilfestellung!
Patrick

Ich schließe mich mal an:

Wenn du unbedarfte Benutzer, bzw. Möchtegern-Hacker abhalten willst die Zugangsdaten sofort zu sehen: Verschlüssele die Txt-Datei und lege den Schlüssel in den Quelltext
Cracker oder zumindest Leute, die wissen wie man mit einem Debugger/Decompiler umgeht, werden das Spiel aber schnell durchschauen und können die Zugangsdaten mit ein bisschen Erfahrung auslesen.

Es liegt an dir zu entscheiden, auf was du mit Kanonen schießen willst. Aber bei Programmen im Netzwerk reicht es völlig aus, die Zugangsdaten im Quelltext zu lassen. Stell dir einfach die Frage, was die Leute mit den Zugangsdaten anstellen könnten/wollen. Begrenze halt die Rechte der Zugangsdaten auf bestimmte Tabellen/Views/Procedures und gut ist. Wenn du hypervorsichtig sein willst, protokollierst du jede Aktivität und schreibst einen WatchDog.

Aber wie gesagt:
Gerade letzteres lohnt sich in der Regel nicht...bleib dann lieber beim geringeren Übel: Verschlüsseln der Txt-Datei und das Ablegen des Schlüssels in der Anwendung.


*edit*
Ich sehe garade: Aber dann ist es auch egal ob du die Zugangsdaten oder den Schlüssel für die Txt-Datei in der Anwendung hast. Beides gleich unsicher...hält aber halt die erstgenannte Kategorie an Benutzern ab. :D

Luckie 24. Aug 2018 14:01

AW: DB-Zugangsdaten verschlüsseln
 
Bitte mach für ein neues Problem auch einen neuen Thread mitbeinem aussagekräftigen Titel auf.

KodeZwerg 24. Aug 2018 14:03

AW: DB-Zugangsdaten verschlüsseln
 
Zu meinem Beispiel noch ein PS:
Wenn Du Probleme mit dem Output haben solltest, bei XOR und Typ String bietet es sich immer an mit Base64-Enc/Dec zu arbeiten.
Also Original String kodieren -> Base64Enc(String) -> Das ist Dein Result zum speichern.
Andersrum, Datei Laden -> Base64Dec(String) -> String dekodieren -> nun hast Du wieder das Original.

Alternativ (so gehe ich meist vor) den Typ auf Binär umstellen (TBytes zum Beispiel) und das speichern/laden auch Binär zu erledigen.
Als Ersatz zum .ini Vorschlag den jemand genannt hatte.
Binär kann man auch Records speichern/laden um auf ein ähnliches Resultat wie .ini zu kommen.

Schokohase 24. Aug 2018 18:41

AW: DB-Zugangsdaten verschlüsseln
 
Zitat:

Zitat von KodeZwerg (Beitrag 1411563)
Als Ersatz zum .ini Vorschlag den jemand genannt hatte.

ini braucht keinen Ersatz für binäre Daten
Hier im Forum suchenSystem.IniFiles.TCustomIniFile.ReadBinaryStream
Hier im Forum suchenSystem.IniFiles.TCustomIniFile.WriteBinaryStream
(da ist der Base64-Kram schon eingebaut)

KodeZwerg 24. Aug 2018 19:00

AW: DB-Zugangsdaten verschlüsseln
 
Ja, und jeder der Notepad hat kann sehen wie man was benennt um es noch einfacher zu haben beim rekonstruieren.

Am besten noch so:
Code:
[Security Option]
DataBasePassWord=
So etwas kann einem im reinen binär Modus nicht passieren, darauf wollte ich hinaus, nicht das ein ablegen solcher Daten nicht Möglich sei.

edit
Und um der Binär Datei noch ein wenig mehr Sicherheit zu geben, erstellt man sich ein paar Fake Records mit was auch immer für Daten, man selbst weiß ja wie die Binär Datei aufgebaut ist, Änfänger im Bereich Reversing eben nicht.

generic 25. Aug 2018 11:53

AW: DB-Zugangsdaten verschlüsseln
 
Ykcim du möchstest doch verhindern, dass ein Benutzer die Datenbankverbindung nicht raus bekommt - also Server, Benutzer und Passwort - Richtig?

Es ist völlig egal, wie du die Zugangsdaten schützt. Wenn Sie lokal gespeichert sind, kann drauf zugegriffen werden. Wenn du sie verschlüsselst, können sie trotzdem lokal entschlüsselt werden. Sonst könnte dein Programm ja niemals eine Verbindung aufbauen können.

D.h. mit der Verschlüsselung schließt du nur ein DAU aus. Findige Benutzer, werden trotzdem die Verbindung finden und könnten diese direkt mit Heidi oder ähnlichen nutzen.

Wenn du keinen Schutz auf Serverebene/Tabellen hast, dann hat auch der Benutzer keine Einschränkung.

Sicher wäre, wenn die Prüfung/Login nur auf einen geschützten System erfolgt, z.B. der Datenbankserver im verschlossenen Rack.

Besser wäre doch:
Der Benutzer ist dem Server bekannt und gibt z.B. die Windowsanmeldung durch.

Uwe Raabe 25. Aug 2018 14:37

AW: DB-Zugangsdaten verschlüsseln
 
Zitat:

Zitat von Ykcim (Beitrag 1411535)
Das ist die XOR-Verschlüsslungsfunktion.

Aber bei manchen Werten baut sie Mist.

Das liegt daran, daß man Unicode-Strings nicht einfach per XOR ver- und entschlüsseln kann. Das mag in früheren Delphi Versionen noch funktioniert haben, als ein Char noch ein Byte groß war und der OEM-Zeichensatz zu jedem Byte ein Zeichen kannte. Mit Unicode gilt das aber nicht mehr und man sollte dann auf Byte-Sequenzen für das Crypting ausweichen. Um weiterhin mit Strings arbeiten zu können, weil die Datentypen nun mal nicht so einfach im gesamten Programm umgestellt werden können, kann man die Byte-Sequenzen z.B. per Base64 encoden. Der String wird dabei aber etwas länger.
Delphi-Quellcode:
uses
  System.SysUtils, System.NetEncoding;

function Decrypt(const Source, Password: string): string;
var
  bPassword: TBytes;
  bSource: TBytes;
  I: Integer;
begin
  Result := '';
  bSource := TNetEncoding.Base64.DecodeStringToBytes(Source);
  bPassword := TEncoding.UTF8.GetBytes(Password);
  for I := 0 to Length(bSource) - 1 do begin
    bSource[I] := bSource[I] xor bPassword[I mod Length(bPassword)];
  end;
  result := TEncoding.UTF8.GetString(bSource);
end;

function Encrypt(const Source, Password: string): string;
var
  bPassword: TBytes;
  bSource: TBytes;
  I: Integer;
begin
  Result := '';
  bSource := TEncoding.UTF8.GetBytes(Source);
  bPassword := TEncoding.UTF8.GetBytes(Password);
  for I := 0 to Length(bSource) - 1 do begin
    bSource[I] := bSource[I] xor bPassword[I mod Length(bPassword)];
  end;
  result := TNetEncoding.Base64.EncodeBytesToString(bSource);
end;

KodeZwerg 25. Aug 2018 15:33

AW: DB-Zugangsdaten verschlüsseln
 
Ich habe gerade mal mein Demo mit Unicode gefüttert, funktioniert bei mir Problemlos, bei Euch auch? (wegen Hinweis von Uwe mit älteren Delphis, was meines definitiv ist [D2009])

Uwe Raabe 25. Aug 2018 16:02

AW: DB-Zugangsdaten verschlüsseln
 
Zitat:

Zitat von KodeZwerg (Beitrag 1411632)
Ich habe gerade mal mein Demo mit Unicode gefüttert, funktioniert bei mir Problemlos, bei Euch auch? (wegen Hinweis von Uwe mit älteren Delphis, was meines definitiv ist [D2009])

Das Nicht-Auftreten eines Fehlers ist allerdings kein Garant für Fehlerfreiheit. Probier mal als Password -134775814 und als Orginal String Hurz

Edit: Der Trick hierbei ist, ein #0 zu provozieren. Das wird dann beim Schreiben in das Edit als Stringbegrenzer betrachtet. Würde man nur mit Delphi-Strings arbeiten, dann tritt zumindest dieser Fehler nicht auf. Es könnte aber immer noch Probleme im Unicode-Bereich der Surrogates geben.

KodeZwerg 25. Aug 2018 17:16

AW: DB-Zugangsdaten verschlüsseln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Demo arbeitet korrekt, Anzeige macht natürlich bei einem Terminator Schluss, habe es gerade überprüft.
Also intern (wovon ich Ausgehe das es nur intern abgewickelt wird) läuft es.
Anhang 49824 Da sieht man das es 4 Zeichen kodiert sind.
Habe einfach Labels für Länge mit rangebaumelt.
Ich schrieb ja weiter oben, bei Problemen mit Output wäre Base64 empfehlenswert.

Bei Bedarf aktualisiere ich Demo indem ich auch Base64 zwischen schubse.
(Dein Code kann mein Delphi noch nicht, die Unit fehlt mir)

KodeZwerg 25. Aug 2018 18:08

AW: DB-Zugangsdaten verschlüsseln
 
Liste der Anhänge anzeigen (Anzahl: 2)
Nach suchen suchen suchen, mein Delphi hat Base64 nur in Indy anscheinend verbaut, also habe ich ein anderes Base64 integriert.

Nun sollte es keine Probleme mehr mit Anzeige geben.
Es wäre nett wenn aktuellere Delphis das mal Compilieren und berichten ob es funktioniert, auch in Zusammenhang mit Unicode. Besten Dank!

Viel Spaß damit.


Ps: Die Base64.pas von Sakura aus CodeLib arbeitet irgendwie so gar nicht mit meinem Delphi zusammen.

Edit
Ganz vergessen, hier der Null-Terminator Test: Anhang 49826

Ykcim 27. Aug 2018 12:51

AW: DB-Zugangsdaten verschlüsseln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Endlich! Das klappt so! Ich habe es mit Delphi XE2 und es klappt. :-D:thumb:
Ich habe auch getestet, ob ich die Werte in einer Datei zwischenspeichern kann und nach dem Auslesen funktioniert das DeCrypt auch.

VIELEN DANK!

Patrick

KodeZwerg 27. Aug 2018 14:09

AW: DB-Zugangsdaten verschlüsseln
 
Das freut mich das Dein Dilemma vorerst behoben ist :thumb:

Wenn Du noch ein Sample benötigst wo das ganze in einer Binär-Datei abgelegt & gelesen wird, einfach Fragen :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz