written by T. Schmidt

Integration kryptographischer Datenbankmethoden


 

Es gibt verschiedene Möglichkeiten, um Datenbankinhalte vor unbefugtem Zugriff zu schützen. Die erste Stufe wird von den Möglichkeiten, die vom Betriebssystem zur Verfügung gestellt werden, gebildet. Je nach Sytem sind diese Möglichkeiten mehr oder weniger nützlich. Die zweite Stufe wird vom Datenbanksystem gebildet. Auch hier sind je nach verwendetem System die Möglichkeiten von Userverwaltung, Userprivilegien bis hin zur Datenverschlüsselung vorhanden oder nicht. Der sicherste Datenbestand ist der verschlüsselte. Hierbei gibt es jedoch zu beachten, das die Art und Stärke der Verschlüsselung und deren Methode auf die Verschlüsselungssicherheit wesentlichen Einfluss hat. Desweiteren ist ein verschlüsselter Datenbestand im Falle eines Systemcrash möglicherweise nicht mehr verwendbar. Somit ist ein Backupsystem zwingender Bestandteil einer Datenbankverschlüsselung. Das Backupsystem sollte in Realtime arbeiten, also jede Änderung des Datenbestandes protokollieren.

Will man unabhängig vom verwendeten Datenbanksystem eine Verschlüsselung integrieren, dann ist eine Schnittstelle zwischen Anwendung und Datenbanktreiber notwendig. Die Borland Database Engine (BDE) bietet mit den Methodenaufrufen der BDE-API diese Schnittstelle an.

Bevor die Daten in die Datenbankdatei geschrieben werden, kann man mit BDE-Methoden die Daten aufbereiten, mit Verschlüsselungsalgorithmen verschlüsseln und anschließend in das DB-File schreiben. Im Beispiel 1 ist dieser Vorgang dargestellt. Die Routine EncryptData stellt vereinfacht die Verschlüsselung dar. Die Daten werden bei diesem Vorgang sofort in die Datenbank eingetragen. Soll ein Rückgängigmachen der erfolgten Änderungen (RollBack) möglich sein, dann ist zusätzlich eine Transaktionskontrolle notwendig. Die BDE bietet zwei Lösungen für eine Transaktionskontrolle an. Mittels CachedUpdates oder mit Databasetransaction. Beispiel 2 implementiert zusätzlich eine Transaktionskontrolle mit Databasetransaction.

Der umgekehrte Weg, die Daten aus der Datenbank auszulesen und an das Table weiterzugeben, erfolgt im Prinzip umgekehrt wie das schreiben der Daten. Das Fehlen einer Methode zum schreiben des Recordbuffers eines Table macht es erforderlich, eine Methode zu verwenden, die die einzelnen Feldinhalte aus dem Recordbuffer ausliest und der Table Methode SetFields übergiebt. Dabei sollte man beachten, das eventuell nicht alle Felder im RecordBuffer vom Table verwendet werden oder deren Reihenfolge abweicht.


 

Beispiel 1. Verschlüsselung von Datenbankdaten

 

function fDbiEncryptData(Table: TTable): DBIResult;
var  CurProp: CurProps; RecBuf: PChar; RecProp: RecProps;
begin
with
Table do begin
  UpdateCursorPos;                // syncronisieren der BDE mit Delphi
  Check(DbiGetCursorProps(Handle, CurProp));
  RecBuf := AllocMem(CurProp.iRecBufSize*SizeOf(Byte));
  try
  Check(DbiInitRecord(Handle, RecBuf));
  Check(DbiGetRecord(Handle, dbiNOLOCK, RecBuf, @RecProp));
  with RecBuf do EncryptData;              // Daten verschlüsseln
  
Check(DbiModifyRecord (Handle, RecBuf, True));
  finally  FreeMem(RecBuf, CurProp.iRecBufSize*SizeOf(Byte)); end;
end;
end;

Beispiel 2. Mit TransactionControl

var TranCurs: hDBIXact;

function fDbiTransCryptData(Table: TTable): DBIResult;
var  DBType: String; I: Word; Mode: eXILType;
begin
  SetLength(DBType, DBIMAXNAMELEN);
  Check(DbiGetProp(hDBIObj(Table.DataBase.Handle), dbDATABASETYPE, PChar(DBType), DBIMAXNAMELEN, I));
  SetLength(DBType, StrLen(PChar(DBType)));
  if DBType = 'STANDARD' then Mode := xilDIRTYREAD;
  Check(DbiBeginTran(Table.DataBase.Handle, Mode, TranCurs));
  try
  fDbiEncryptData(Table);
  except on E.Exception do Check(DbiEndTran(Table.DataBase.Handle, TranCurs, xendABORT));
  Check(DbiEndTran(Table.DataBase.Handle, TranCurs, xendCOMMIT));
end;

 


 

Microsoft ©  und Borland © sind eingetragene Warenzeichen.