BC Tools
Tools
Auf der Registerseite Tools sind ein paar unterstützende Funktionen untergebracht.
- Hash erzeugt zu einem eingegebenen Wert den Hash, der Algorithmus lässt sich auswählen
- DB Column Convert konvertiert Spalteninhalte und ist im Moment der rudimentär entwickelt
- Create GUID erzeugt eine GUID
- Excrypt verschlüsselt Passwörter, zum Beispiel Datenbankpasswörter für die Ini-Datei.
Encrypt
Bei der Verschlüsselung von Passwörter soll für jedes Passwort ein anderer Verschlüsselungswert verwendet werden - dieser kann zwischen 111 und 999 eingestellt werden. Mit Go wird der eingegebenen Text (hier Test) verschlüsselt und zur Kontrolle auch gleich wieder entschlüsselt.
Die Entschlüsselung von Passwörtern ist aus Sicherheitsgründen bei den Tools nicht vorhanden. Das sollte jedoch nicht darüber hinwegtäuschen, dass jeder, der den Quelltext vorliegen hat, mit dem Debugger den Klartext auslesen kann.
Für etwas mehr Sicherheit sollte man sich seine eigene Unit erstellen, dazu wird auf Create Unit to Clipboard geklickt und dann ist in der Zwischenablage so etwas wie der folgende Code, wobei die texte für s zufällig generiert werden.
111: s := 'VGksIy0Jwogdw6rCqsOQMQ3CscObw5jDq20zZCwJw61DwrHCg8K2HQE6'; 112: s := 'w4fCl8KYw6DDgsKDwq3DkcKuw4VTLcKRURIyasOmR8KkfH3DvF0owpDDvDvDocKn'; 113: s := 'VwjDnsOjwpwkwplZd8O8Tn/Cg8Kaw7gYcMOVwow0w57DvmFLfcO+GsKPW0U='; 114: s := 'a8OldQzCmDTDp8K2wpPDrlliw7sIwoLDtcKAw43DpSdaKBhlw5hvO8KLSMK1'; ... 998: s := 'wptcTgbCtsOBacKcw49XFw3Dn8O5QMOiVHHDjzcNVsKkw5sSwpkUTcOLfA=='; 999: s := 'X3PCpsORwq4Dd8K+fgACXsKJw4Zvw7vClHrCpsOJwrnDp8OLRgcPXcK1wpUN';
Der generierte wird in die Unit uBafCrypt, dort in die Funktion BafGetXorString eingefügt.
unit uBafCrypt; interface uses System.NetEncoding, Classes, SysUtils; function BafEncrypt(ANum: integer; AText: string): string; function BafDecrypt(AText: string): string; function BafGetXorString(ANum: integer): string; function BafGetXorValues: string; implementation function BafEncrypt(ANum: integer; AText: string): string; var s, t: string; i, j: integer; begin s := BafGetXorString(ANum); for i := 1 to Length(AText) do begin j := 1 + ((i - 1) mod (30)); t := t + chr(Ord(AText[i]) xor Ord(s[j])); end; result := IntToStr(ANum) + TNetEncoding.Base64.Encode(t); end; function BafDecrypt(AText: string): string; var s, t: string; i, j, LNum: integer; begin if Length(AText) < 7 then exit; t := copy(AText, 1, 3); LNum := StrToInt(t); s := BafGetXorString(LNum); t := TNetEncoding.Base64.Decode(copy(AText, 4, MaxInt)); for i := 1 to Length(t) do begin j := 1 + ((i - 1) mod (30)); result := result + chr(Ord(t[i]) xor Ord(s[j])); end; end; function BafGetXorString(ANum: integer): string; var s: string; begin case ANum of 111: s := 'w65hw4nDvsObwpEmCsOVwqHDrzDDvi7DhCHChGjCqArCkmYSEMK1w43CowVeKQ=='; 112: s := 'R13CgsKQw5/CiGNrwqlEE8KMBcKWOcOcVWYiRg4HN8K/Qw5MfjJW'; 113: s := 'cMOGwqgGMsOaN8O8eMO/wqTDuGrCm8O+WQDDmj5hQmluND8xwrEbUCQ='; 114: s := 'wqfDgSxwC2bDlcORwohBwoTCuxrClcOuwpDChCzCqzXCqD3ClMKiw4nDrU5LC8O3'; ... 996: s := 'wp0ZFBRiGRNTwrbDmCzDr3sbwrbCrcOWw6gRfWPCuMKaw5JmwrTCtcKdFio='; 997: s := 'LcK4LcOLPMOvc14Hw63Dq8OsW8OBw4HCmMOww4JIwq/CiwHCgsKYwrrCjhLCtQtI'; 998: s := 'wppbw6zDusOKcMKuw7HDhGI6Y8KBccKEP1vCkMOPSQVQQsKWasKWZcOOYBs='; 999: s := 'worDgxXDqzNGwqVfw7xQTVvCocOXDsK4FcOxw5Ykw5QmZ8Ozw6DDt8KdwpoJGQ=='; else raise Exception.Create('Num out of range'); end; result := TNetEncoding.Base64.Decode(s); end; function BafGetXorValues: string; var LNum, i: integer; sl: TStringList; s: string; begin Randomize; sl := TStringList.Create; try for LNum := 111 to 999 do begin s := ; for i := 1 to 30 do s := s + Chr(Random(256)); sl.Add(' ' + IntToStr(LNum) + ': s := ' + QuotedStr(TNetEncoding.Base64.Encode(s)) + ';'); end; result := sl.Text; finally sl.Free; end; end; end.
Wir haben hier eine klassische XOR-Verschlüsselung mit einem Schlüssel, der länger als das Passwort sein sollte. Von der Seite ist das Verfahren mathematisch beweisbar sicher (sofern jeder Verschlüsselungswert zwischen 111 und 999 nur einmal verwendet wird). Gegen Angriffe, die Zugriff auf den Code haben und den Klartext im Debugger auslesen können, hilft das selbstverständlich nichts.