Naive Brute-Force-Angriff
Es ist ein nicht sinnvoll, die Lager TABSDatabase
zu verwenden, um einen Brute-Force-Angriff versuchen seit:
- interne Hash-Verfahren und Verschlüsselungsverfahren einen eindeutigen Puffer als Eingabe verwenden und Ausgabe (als Referenz übergeben). Jede Iteration erforderte die Verarbeitung des gleichen Eingangsinhalts (kein Caching zur Wiederverwendung wegen CPU-Zeiteinsparung).
- Jedes falsche Passwort löst eine Ausnahme aus, und SEH fügt eine weitere Strafschicht hinzu (zeitliche Komplexität).
- Ich vermute andere Neben-Design-Funktionen (Gegenmaßnahmen gegen Brute-Force-Angriff).
Erste jede superflous Last befreien
ich mit dieser arbeiten nackten Delphi-Klasse in meinem Versuch kam:
type
TABSDBHack = class
private
FFilename: TFileName;
// 2 relevant contiguous headers of an Absolute Database file
FDBHeader: array [0..SIZEOFDBHEADER-1];
FCryptoHeader: array [0..SIZEOFCRYPTOHEADER-1];
// Mirror of the ControlBlock record from CryptoHeader
FControlBlock: array [0..SIZEOFCONTROLBLOCK-1] of Byte;
//
function GetEncrypted: Boolean;
function GetFileName: TFileName;
function GetPageSize: Word;
function GetPageCountInExtent: Word;
function GetCryptoAlgorithm: Byte;
protected
// Retrieving Data from stream into FDBHeader and FCryptoHeader
procedure ReadStream(F: TStream);
// Mainly FillChar(..., ...,#0) of the corresponding record
procedure ClearDBHeader;
procedure ClearCryptoHeader;
procedure ClearControlBlock;
// Probe the existence of 'ABS0LUTEDATABASE' as file signature
function CheckABSSignature: Boolean;
// Compute the CRC of FControlBlock record
function CRC32: Cardinal;
// Decrypt the persisted Control Block into FControlBlock
function InternalDecryptBuffer(const APassword: string):Boolean;
public
procedure Clear;
// Wrapping a ReadStream using a local TFileStream
procedure LoadFromFile(Filename: TFileName);
// Return True if the decrypted Control Block correspond to original plain one.
// Otherwise stated: The persisted CRC (in the Crypto Header) is equal to
// the value returned by the function CRC32
function CheckPassword(const APassword: string): Boolean;
property FileName: TFileName read GetFileName;
// Sample of plain Data peristed that can be retrieved
property PageSize: Word read GetPageSize;
property PageCountInExtent: Word read GetPageCountInExtent;
property Encrypted: Boolean read GetEncrypted;
property CryptoAlgorithm: Byte read GetCryptoAlgorithm;
end;
I relevante Daten direkt aus der Datei abgerufen und ein bestimmtes Passwort prüfen.
Haftungsausschluss:
benutzte ich eine Personnal Ausgabe von Absolute Database Version 6.0.7 zu entwickeln.
Die Klassendefinition wurde von jeglicher Bezugnahme auf Typdefinitionen aus den verteilten DCUs bereinigt und ich bin nicht berechtigt, eine darauf basierende Binärdatei zu verteilen.
Bekanntlich hängt es stark von der DCU-Verteilung ab, hauptsächlich für die Hash- und Entschlüsselungsmethode. Mit der Zeit und mehr Wissen über die Interna der Absolute Database sollte eine Implementierung ihrer Verschlüsselungs-Engine in einem Reinraum möglich sein: Es scheint, dass es auf dem Delphi Encryption Compendium einer Freeware von Hagen Reddmann basiert.
andere Richtung
- Brute zu erkunden zwingt die Ebene Control Block erholen kann in Betracht gezogen werden, wie SIZEOFCONTROLBLOCK nur gleich 256 ist.
- Bei einem Paar einfacher/verschlüsselter Steuerblöcke ist die Wiederherstellung der internen Darstellung des Schlüssels mit zu brutaler Gewalt möglich, aber passen Sie auf: 128/192/256 für AES/Rijndael zum Beispiel !.
- RipeMD (128 sowie 256), eine bekannte One-Way-Funktion, wird intern verwendet, um den Schlüssel zu initialisieren: Ich fürchte, es ist nicht vernünftig, einen String mit seinem Hash wiederherzustellen!
- Die meisten der Crypto-Algorithmus (die jüngsten mindestens) unterzog sich einer gründlichen Prüfung unter öffentlicher Kontrolle vor ihrer Annahme als Standard: Einfach gesagt sind sie stark, sehr stark meine ich.
Fazit
Ja! Es ist möglich, das Passwort unter bestimmten Bedingungen wiederherzustellen.
Wenn Sie mit TABSDBHack herumspielen, ist der Schlüssel zum Erfolg, einen Weg zu finden, den Suchraum zu verkleinern (Passwort ist vom Stringtyp): Es ist einfach, vor allem für schwaches Passwort. Ich betone, es funktioniert.
Die Jungs von Component Ace sind schlau und haben ihren Job gut gemacht (unter anderem das Kryptosystem entworfen): Sie können sich auf die Absolute Database verlassen, ich befürworte das stark.
Haben Sie versucht "1234": -? Nein, im Ernst, ich schlage vor, [Kreditor] (http://www.componentace.com/company/contact_us.php) zu kontaktieren. – TLama
Brute Force-Angriff kann lange dauern. Sie könnten versuchen, die DLL und ihre Funktionen zu verknüpfen, und sehen, wenn Sie sehen können, dass die Daten an die DLL übergeben werden, wo sie die Datenbank öffnet oder das Passwort eingibt, das möglicherweise kein ASCII-Text ist, könnte es ein binärer privater Schlüssel sein. Angenommen, Sie haben den Quellcode für die Delphi-App? Das Passwort könnte innerhalb des Quellcodes sein, richtig? –
Wenn ich zwischen den Zeilen lese, nehme ich an, dass Sie auch den Quellcode der App verloren haben, nicht wahr? – menjaraz