私の現在のプロジェクトの 1 つで、シングル ユーザー認証システムを利用しています。同じ Windows アカウントの複数のユーザーに対してこれを機能させる予定がないため、「シングル ユーザー」と言います (単純に、私がやりたいことではないからです)。
ユーザーがアプリケーションを起動すると、認証画面が表示されます。この認証画面では、画像 (つまり、画像内の特定の 3 点をクリック)、ユーザー名 (標準の編集ボックス)、および画像の選択 (使用する画像を選択できるドロップダウン メニュー) を使用します。画像の選択、ユーザー名、および画像上でクリックされたポイントは、ユーザーがパスワードを設定するときに指定したものとすべて一致する必要があります。
3 つの結果はすべて文字列に結合され、Soap.EncdDecd.EncodeString
メソッドでエンコードされます。これは、SHA-512 を使用してハッシュされます。最後に、DES を使用して暗号化されます。この値は、パスワードの設定時に作成された値と比較されます。一致する場合、アクセスが許可されます。そうでない場合、アクセスは拒否されます。アプリケーションの他のポイントで SHA512 値を使用する予定です (メイン アプリケーション内のさまざまなモジュールで自分自身を認証するための「マスター パスワード」など)。
一例では、初期文字列の長さは 29 文字、SOAP エンコード文字列は約 40 文字、SHA-512 文字列は 128 文字、DES 値は 344 文字です。私は大規模な文字列を扱っていないので、実際には非常に高速です。SOAP は、セキュリティ対策としてではなく、非常に基本的な難読化として使用されました。
私の懸念は、最初の部分 (プレーン文字列と SOAP) が弱点になる可能性があることです。基本的な文字列は、入力するだけでアクセスが許可されるものではありませんが、ユーザー名と画像の選択とともに「画像クリック座標」を提供し、アプリケーションへのアクセスを許可する可能性があります. SOAP 文字列は簡単にデコードできます。
認証のこの最初の部分を強化して、値がメモリから直接引き抜かれるのを回避するにはどうすればよいでしょうか? この方法で値を読み取る潜在的な悪用者または攻撃者についても心配する必要がありますか?
この同じトピックに直接関連する追加の質問として;
初期セットアップ中にユーザーが作成するパスワード ハッシュを保存する最良の方法は何ですか?
私は現在、TIniFile.SectionExists
よりエレガントなものを考え出すことにまだ慣れていないため、メソッドを実行しています。これは私の知識が不足している分野の 1 つです。セッション間でパスワードの「ハッシュ」を保存する必要があります (そのため、メモリ ストリームを使用することはできません)。
それは、私が気にする必要があるかどうか、そして私が行ったエンコーディング、ハッシュ、および暗号化が実際に十分かどうかということです。私が開発したピクチャパスワードシステムは、従来の「テキストベースのパスワードが何であるかを知っているので、今私はあなたのシステムにいる」という攻撃を阻止するための優れた基盤となっていますが、メモリから読み取るより技術的な攻撃については心配しています. .