私は秘密鍵を持つアプリケーションがどのようにそれを安全に保つのか疑問に思っていましたか?
秘密鍵がバイナリの外部にある場合、誰でもアクセスできますが、バイナリに格納しても安全性は高くなりません(私はそう思います)。キーを難読化することもできますが、それでも発見できます!
それで、その問題のベストプラクティスは何ですか?
妥協することを期待してください。秘密鍵を難読化する以外に、良い方法はありません。最善の策は、ソフトウェアを実行しているシステムの暗号ライブラリに保存することです。運が良ければ、キーを安全に保存できるTPMまたはHSMがあるかもしれません。秘密鍵で何を達成しようとしていますか?これは、目標を安全に達成するための最良の方法について、より良いフィードバックを提供するのに役立ちます。
RSA秘密鍵やその他の種類のオブジェクトであっても、リバースエンジニアリングに抵抗するような方法で、アプリケーション内に100%信頼できる方法で秘密を隠す方法はありません。試みたすべての人が失敗しました。理論的にはそれが不可能であるべき理由がいくつかあります。つまり、ある時点で、CPUは秘密の値を使用するため、その値を手に入れることになります。エミュレータでコードを実行することにより、攻撃者はそれを取得することもできます。
(エミュレーターは、単なるドロップオンザ核のようなソリューションです。それは機能し、保護の不可能性を示すのに十分ですが、攻撃者は常にリバースエンジニアリングで少し多くの頭脳を使用します。)
あなたが持つことができる最高のものはユーザー固有のシークレットなので、少なくとも、犯罪者のアクセスをシャットダウンすることでサーバー側の事柄を管理できます(アクセス許可キーが危険にさらされています。この特定のキーが受け入れられなくなることをサーバーに通知してください)。これが satellite TV で行われます:信号はブロードキャストされ、キーで暗号化されます[〜#〜] k [〜#〜](数分ごとに変化します)、およびキー[〜#〜] k [〜#〜]自体が受信機のスマートカードにある秘密鍵。各レシーバーには独自のスマートカードがあります。カードが大量に複製されているように見える場合(カードを壊すのは高価ですが、一度壊すと3000枚コピーする方が安上がりです)、TVディストリビューターは[〜# 〜] k [〜#〜]侵害されたカードにあるキーで暗号化され、すべてのコピーへのアクセスを効果的にブロックします。
.Net Frameworkを使用している場合は、 ProtectedData を確認してください( this stackoverflow answer で説明されています)。
「ユーザーまたはマシンの資格情報を使用してデータを暗号化または復号化する保護を提供する」ために、Windows Data Protection API(DPAPI)を使用します。 (ドキュメントから取得)。
使用しているシステムには現在ハードウェアセキュリティモジュール(HSM)が搭載されていませんが、個別に購入できます(アドインカード、スマートカード、個別のボックスなど)。状況(キーの値、露出など)によっては、これは価値があるかもしれません。
HSMを正しく使用すると、アプリケーションでさえ秘密鍵に直接アクセスできなくなります。これにより、HSMが提供する認証オプションによって支援される、HSMによって提供されるサービス(ファイルの復号化など)の保護(ab)使用に問題が移ります。