ナイーブブルートフォース攻撃
これは、以来、ブルートフォース攻撃を試みるように株式TABSDatabase
を使用する以外の意味です:内部ハッシュ方法と暗号化方法は、入力として独自のバッファを使用し
- と出力(参照として渡されます)。すべての反復では、同じ入力コンテンツを処理する必要がありました(CPU時間の節約のために再利用のためのキャッシングはありません)。
- すべての偽のパスワードは例外を発生させ、SEHは別のペナルティ層(時間の複雑さ)を追加します。
- 私は他の設計上の特徴(ブルートフォース攻撃に対する対策)が疑わしいです。私は、ファイルから直接関連するデータを取得し
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;
:
は、私は私の試みで、この作業裸Delphiのクラスを思い付いた
ごとに余分に負荷退治します与えられたパスワードを調べる。
免責事項:
私はそれを開発するために絶対的なデータベースのバージョン6.0.7の個人的な版を使用しました。
クラス定義は、配布されたDCUからの任意の型定義への参照から除外されており、それに基づいてバイナリを配布する権利はありません。
知られているように、DCUの配布に大きく依存します。主に、ハッシュおよび復号化方法です。 Absolute Databaseの内部についての知識があれば、暗号化エンジンのクリーンルーム実装を実現することが可能です。Delphi Encryption Compendium Hagen Reddmannのフリーウェアを使用しているようです。
他方の方向はSIZEOFCONTROLBLOCK 256にのみ等しいとみなすことができる普通制御ブロックを回復するために強制的
- ブルートを探索します。
- プレーン/暗号化されたコントロールブロックのペアを指定すると、キーの内部表現を復元することが可能ですが、AES/Rijndaelの場合は128/192/256など注意してください。
- よく知られている一方向関数であるRipeMD(128と同様に256)は、内部的に初期化するために使用されます。Key:ハッシュを与えられた文字列を回復することは合理的に実現できません。
- ほとんどの暗号アルゴリズム(少なくとも最近のもの)は、標準として採用される前に、公開された精査の下でテストを受けました。
結論
はい!いくつかの規定の下でパスワードを回復することは可能です。
TABSDBHackで遊んでいるときには、検索スペースを減らす方法(パスワードは文字列型です)を見つけることが重要です:特に弱いのパスワードの方が簡単です。私は強調します、それは動作します。
コンポーネントエースのガイは、スマートであり、彼らの仕事(他のものの中で暗号システムを工夫している)がうまくいっています。絶対的なデータベースに頼ることができます。私はそれを強く主張します。
あなたは '1234'を試しましたか? - ?いいえ、真剣に、私の提案は['vendor'](http://www.componentace.com/company/contact_us.php)に連絡することです。 – TLama
ブルートフォース攻撃には長い時間がかかることがあります。 DLLとその関数をフックして、データベースを開くDLLに渡されるデータやASCII文字ではないパスワードを渡すことができるかどうかを調べることができます。バイナリの秘密鍵である可能性があります。 delphiアプリケーションのソースコードがあるとします。パスワードはソースコード内にある可能性がありますか? –
行間を読んで、私はあなたがまた、アプリケーションのソースコードのトラックを失っていると思いますか? – menjaraz