3

セキュリティを強化するために、別のアプリケーションとの SSL 接続 (QSslSocket) を使用する C++ で記述された Qt アプリケーションがあります。ただし、アプリケーションには秘密鍵が埋め込まれています。

Process Explorer などのアプリケーションを使用すると、秘密鍵を簡単に見つけることができます。(ファイルのプロパティ -> 文字列)

私のアプリケーションにとってセキュリティはそれほど重要ではありませんが、アプリケーションから秘密鍵を取得するのをもう少し難しくするとよいでしょう。何か方法はありますか?

4

4 に答える 4

4

「strings」は、実際の Ascii/UTF8/Unicode 文字列であるブロックのみを検索します。キーをバイナリ バッファとして保持する場合、文字列が通常無視するランダムなバイナリ データと区別するものは何もありません。

それ以外にも、IDA や OllyDebug など、ユーザーがプログラムを完全に逆アセンブルまたは逆コンパイルして、何をしようとしてもキーを取得できるようにする、はるかに賢いプログラムがあります。

于 2009-08-29T22:25:08.107 に答える
1

いくつかの単純な対称アルゴリズムで暗号化します。たとえば、配列cryptedDataを定義cryptedDataKeyしてn、秘密鍵の-番目のバイトがによって取得できるようにしcryptedData[cryptedDataKey[n]]ます。それはテキストエディタであなたのバイナリ実行可能ファイルを見る誰かからあなたを救うでしょうが、多かれ少なかれ経験豊富な人に対しては助けにはなりません。

また、ランタイムとの永続的な接続がある場合はQSslSocket、秘密鍵がそのままメモリに保存されている可能性があります。したがって、QTライブラリを変更するだけで、メモリ内のキーの表示を混乱させることができます。

于 2009-08-29T22:44:50.267 に答える
1

別の角度から問題を解決する必要があるかもしれません。

何をしても、適切なツールと知識を持っている人がコードを破って秘密鍵を見つけ出すことができるという点で、Shooshの答えに同意します。

必要なのは、データを外部化するか、秘密鍵が見つかった場合のリスクを軽減することです。

個人データを外部化する最善の方法は、使用するユーザーが入力する必要があるユーザー指定のパスワードでデータを暗号化することです。残念ながら、これはほとんどのアプリケーションにとって妥当ではありません。

リスクを軽減するために、私は通常、セキュリティが破られた場合に 1 つの「インストール」だけが危険にさらされるようにしています。

たとえば、インストール時に秘密鍵データをランダムに生成します。

クライアント/サーバー アプリケーションの場合、https モデルに従い、公開/秘密キー通信を使用して、ランダムに生成された暗号化キーを交換できます。

各クライアントのインストールに独自の公開/秘密鍵セットがある場合、サーバーはどのクライアントが接続しているかを知ることができ、問題がある場合はクライアントを非合法化できます。

それが役立つことを願っています。

于 2009-08-30T03:27:02.397 に答える
0

もう1つの一般的な手法は、秘密のデータをアイコン画像などのバイナリリソースに配置することです。

于 2009-08-29T23:19:10.917 に答える