2012-02-11 26 views
9

最近私はFTPを扱っており、IndyコンポーネントTIdFTPのセキュリティについてはわかりません。だからこそ私はあなたと共有したいいくつかのテストを作りました。ベストプラクティスについてのあなたの意見と、それがどのように行われているかを示すことができます。Delphi 7 TIdFTP FTPセキュリティ(パスワード保護)

私はちょうどオブジェクトインスペクタを使用してコンポーネントにユーザ名とパスワードを追加しましたまず第一に: enter image description here

とうまく動作し、簡単な接続を作成しました:

procedure TForm1.FormActivate(Sender: TObject); 
begin 
    try 
    FTP.Connect(); 
    ShowMessage ('Connection success'); 
    except 
    ShowMessage ('Connection failure'); 
    end; 
end; 

をこの方法に問題があります

Host = 'ivstefano.com' 
Password = 'testpass' 
Username = 'testuser' 

:あなたはリソースハッカーのような単純なツールを使用する場合は、すぐにすべてのデータを見ることができます

FTP.Host:= 'ivstefano.com'; 
FTP.Username:= 'testuser'; 
FTP.Password:= 'testpass'; 
誰かがある場合

まだ賢く、彼は簡単に六角エディタのようないくつかのツールを使用して見ることができた:それから私は他のみんながそうであるようOIから削除し、コードの中に挿入することによって、少し賢くなることにしましたexeファイルにコンパイル中です: enter image description here

それでは、私は最終的にやったことは、あなたがここにSample OTP toolからダウンロードできるOTP(One Time Pad Wiki)を使用して暗号化ツールを作ることだった。

enter image description here

パスワード「testpass」をキーワード「lemon」で暗号化するために使用しました。それから私は、OTP暗号化された文字列(#25+#2+#3+#7+#117+#19+#31+#6)とキー(#108+#101+#109+#111+#110)を取った両方の文字のASCII和中と再びOTPを使用してそれらを復号化するために私のメインのftp接続プログラムでそれらを使用:

function opt(text, key: String): String; 
var i: Integer; 
begin 
    SetLength(Result, length(text)); 
    for i:= 1 to length(text) do 
    Result[i]:= Char(Byte(text[i]) xor (i + Byte(key[i mod length(key)]))); 
end; 

procedure TFTPTester.FormActivate(Sender: TObject); 
var decyptedPass: String; 
begin 
    decyptedPass:= opt(#25+#2+#3+#7+#117+#19+#31+#6, #108+#101+#109+#111+#110); 
    FTP.Host:= 'ivstefano.com'; 
    FTP.Username:= 'testuser'; 
    FTP.Password:= decyptedPass; 
    try 
    FTP.Connect(); 
    ShowMessage ('Connection success with pass: ' + decyptedPass); 
    except 
    ShowMessage ('Connection failure'); 
    end; 
end; 

とすることができますように

enter image description here

そして、我々は再び六角を見れば、私たちは、キーフレーズと暗号化されたパスワードがプレーンテキストのパスワードここにあるが、少なくともではないことがわかります:それは正しく接続されている参照

enter image description here

結論:それでも、「ハッカー」はキーフレーズと暗号化されたパスが見ることができますが、彼が持っているので、コードをリバースエンジニアリングして確認するためにキーを使用してパスを解読する方法を推測するのは難しいように何が起こっていますか私が使った暗号の種類。基本的に私は独自の暗号化と解読を発明することができますので、OTPは必要ありませんが、誰かがさらに高度であれば、暗号化されたパスワードを解読し、その鍵を使って暗号化されたパスに適用してアクセスします。

追加情報:おそらくDelphiコードを難読化する方がはるかに良い選択でしょうか?

質問:あなたのパスワードを保護する良い方法はありますか?

SOURCES:ここではFTPTesterとOTP生成のためのソースコードを見つけることができます。Link to both

+1

... FTPは大きなセキュリティホールでプレーンテキストとしてパスワードを送信しました。 OTP(ワンタイムパッド)は、保護されるデータと同じ長さのキーを使用します(キーは完全にランダムでなければなりません)。 –

+0

あなたは正しいですが、私が質問したとき、私はそれ以上は分かりませんでした:) – ziGi

+0

少なくとも質問を修正することからあなたを止めるものはありません。 :) OTPはすべての時間の最も誤解された暗号化方式でなければならないが、最も単純な... –

答えて

2

exeファイルを暗号化するのに、asprotectのようなソフトウェア用の保護ツールを使用します。

しかし、いずれにせよレミールボーとしては何を見せていることはOTPはないことに注意してください

5

本当にあなたがパスワードを保存する方法は重要ではありません。十分なリバースエンジニアリングを使用して、使用するストレージをハック可能にします。遅かれ早かれ、プレーンテキスト版はTIdFTPに渡される前にメモリ内で復号化されなければならず、復号化が行われた後にそのメモリを見ることができるツール(IDAなど)があります。デバッガで実行可能ファイルを実行し、PasswordプロパティセッターまたはConnectメソッドにブレークポイントを置き、ヒット時にメモリを表示するだけです。

FTPプロトコルはパスワードをプレーンテキストで送信するため、Wiresharkなどの単純なパケットスニッファであっても、SSLを使用しない限り、実行ファイルをハックすることなく見ることができますIndy 9以前は、FTPのためのIndy 10へのアップグレードをサポートしていなかった)。

関連する問題