BC Tools

Aus bafbal.de
Version vom 12. Juni 2021, 18:49 Uhr von Michaelebner (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „=Tools= Auf der Registerseite ''Tools'' sind ein paar unterstützende Funktionen untergebracht. 977px|Tools * ''Hash'' erzeugt…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Tools

Auf der Registerseite Tools sind ein paar unterstützende Funktionen untergebracht.

Tools

  • 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.