web-dev-qa-db-ja.com

C#に静的文字列(キー)を安全に埋め込むにはどうすればよいですか?

APIキーをWP7アプリケーションに安全に保存する方法を探しています。キーは文字列で、現在コードにハードコーディングされています(以下を参照)。リフレクタープログラムを持っている人なら、簡単にこれを見ることができることは知っています。このキーをアプリの一部としてパッケージ化するより良い方法はありますか?リソースはより安全でしょうか?

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt";

(これは実際にはキーではありません;))

前もって感謝します。

50
Chris Gonzales

コードの Safeguardデータベース接続文字列とその他の機密設定 をご覧ください。あなたの質問は、「アプリケーションソースコードのキーを隠す」セクションの下にあります。

抜粋:

アプリケーションでキーを定義する場合は、アセンブリを難読化するだけでなく、実際のキーバイトをソースコードに格納しないようにしてください。代わりに、暗号化アルゴリズム、キーサイズ、パスフレーズ、初期化ベクトル、ソルトなどの永続的な特性を使用してキー生成ロジックを実装します( の例を参照してください)対称を使用したデータの暗号化と復号化( Rijndael)Key )。これにより、間接層が追加されるため、アプリケーションバイナリからシンボルをダンプするだけではキーにアクセスできなくなります。キー生成ロジックとキー特性を変更しない限り、結果のキーは同じであることが保証されます。また、静的文字列をキー生成特性として使用せずに、オンザフライで構築することもお勧めします。もう1つの提案は、データストアと同じように、つまり適切なACLを適用して、アセンブリを処理することです。また、このオプションは最後の手段としてのみ使用してください。他のデータ保護手法がどれも機能せず、唯一の代替策は機密データを暗号化しないままにすることです。

22
maka

私はこれらすべての回答を読みましたが、どこに配置するか、どのように難読化するかに関係なく、これを安全に埋め込む方法はないと思います。 XAP内にあり、アプリケーション内でデコードされている限り、いつでもハッキングできます。

妥当な程度の保護を備えたxap内にキーを出荷する必要がある場合、@ makaの答えが最善の策をもたらすと思います-できる限りそれを難読化します-しかし、これは安全になるとは思わない-つまり、あなたのモバイルバンキングアプリのためにこれをしてください!

または、本当にセキュリティが必要な場合は、アプリ内だけで操作するのではなく、Webサーバーも使用してください。たとえば、Facebookアプリを実行していて、Facebookの秘密鍵を何らかの方法で保護する必要がある場合、認証のためにユーザーをアプリからサーバーのWebページにリダイレクトする必要があります。そのWebページは、アクセストークンを取得するプロセスをユーザーに案内する必要があります。その後、そのアクセストークン(パブリックappidと共に)だけがアプリに戻る必要があります。そして、すべての呼び出しに伴う秘密鍵の知識を必要とするWebサービスの場合、おそらくすべての呼び出しがサーバーを経由する必要があると思います。

11
Stuart

Apiキーを ProtectedData で暗号化し、実行時に復号化できます。これは、Windows Phoneでデータを暗号化する方法の良いチュートリアルです: Mangoでの暗号化

5
Ku6opr

事前に暗号化してapp.configに保存することもできます。そして、それを読んでいる間、同じアルゴリズムを使用してそれを解読します。

0
Dipesh Bhatt

DotFuscator を使用して、リフレクターを使用する機能を無効にすることができます。しかし、これでは再コンパイルせずにキーを変更することはできません。

以前は、他の(Web/Winformベースの)ソフトウェアで次の方法を使用しました。

http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx

0
Peter R

それはおそらく答えではありませんが、それが提案であることを確認してください:

暗号化されたキーをデータベースに保存します。暗号化された「dbパスワード」をapp.configに保存します。

  1. 2つの適切な文字列暗号化/復号化アルゴリズムを使用します。たとえば、アルゴリズムxとyです。
  2. 公開する前に、暗号化されたdbパスワードをapp.configに入れます。
  3. 新しい暗号化された文字列(実際の文字列)を取得するためにデータベースに接続するためのapp.config password(algo y)を破棄します。
  4. 接続を閉じ、リフレクターなどの場合、アルゴリズムxで新しい文字列を復号化します。走っていない。
  5. これを使って。
  6. 文字列を保持するオブジェクトを破棄します。
0
Lost_In_Library