PHP スクリプト (authentication.php?UserID=ClientsEmail@email.com&ClientsID=81E17) と通信するアプリケーションを作成していますダウンロードできます。インターネット上のすべての通信は AES-256 (CBC) で暗号化され、メインの暗号化キーは実行可能ファイルにハード コードされます。このメイン キーは、exe を再コンパイルし、アップグレードとしてすべてのクライアントに渡すことによって、年に 1 回だけ変更されます。このキーはめったに変更されないため、できれば繰り返さない初期化ベクトルを生成することが重要です。
私の暗号テキスト出力は Base 64 なので、IV をできるだけ統一するようにしました。つまり、IV が暗号テキスト出力の一部であるかのように見えるようにしました。
したがって、私の最初の質問は、以下の関数が繰り返される可能性がどのくらいかということです。タイマーがオンになっているテストアプリを作成し、以下の関数をループしてデータベースに追加し、繰り返されるかどうかを確認しました。テスト アプリは一晩実行され、合計 69369 回のループがあり、繰り返しはありませんでした。
// Generate a 16 bytes = 128 bits Initialization vector Used for AES-256
Function TfrmMain.GenerateIV:String;
Var
i,j : Integer;
Const
{Uppercase}
alpa_L : array[1..26] of string = ('a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z');
{Lowercase}
alpa_U : array[1..26] of string = ('A','B','C','D','E','F','G','H','I','J','K',
'L','M','N','O','P','Q','R','S','T','U','V',
'W','X','Y','Z');
{numeric}
Num : array[1..10] of string = ('0','1','2','3','4','5','6','7','8','9');
Begin
Result := '';
Randomize;
for i := 1 to 16 do //16 bytes = 128 bits AES=Fixed 128 Blocks
Begin
j := RandomRange(1, 4); //RandomRange - Delphi's help says inclusive but it is non-inclusive
case j of
1: Result := Result + alpa_L[RandomRange(1, 27)]; {alphabetic Uppercase}
2: Result := Result + alpa_U[RandomRange(1, 27)]; {alphabetic Lowercase}
3: Result := Result + Num[RandomRange(1, 11)] {numeric}
end;
end;
end;
そうは言っても、まとめようとしている別のアイデアがあります。私の考えは、メインの暗号化キーを実行可能ファイルにハードコーディングする代わりに、次のとおりです。私のサーバーは暗号化キーをランダムに生成し、保護されていない状態でアプリケーションに渡します。サーバーとアプリ間のすべての通信は、そのセッションのこのキーを使用して暗号化され、すべてのファイルがダウンロードされると、セッションが閉じられます。
上記の唯一の問題は、暗号化キーがそのセッションで保護されていないアプリケーションに送信されるため、少し知識があれば、アプリとサーバーが通信しているものを確認でき、ハッカーは認証がどのように行われるかを確認できることです。これを知ったら、アプリケーションをサーバーにリダイレクトして認証部分を実行し、通常どおり続行できます。これを回避する唯一の方法は、このキーを保護することですが、「実行可能ファイルにハードコードされた」という正方形に戻ります。
したがって、このアプリケーションの最初のバージョンでは、上記の問題が解決されるまで、キーを実行可能ファイルにハード コードすることになります。
残念ながら、サーバーは (HTTPS) プロトコルをサポートしていません