2012-04-18 10 views
9

私はアプリの中に秘密の文字列キーを格納する必要があります。その値は決して変更されず、コード内で手動で設定されます。リバース・エンジニアリングの方法では難読化が適用されているにもかかわらず、明らかにそれをStringとして保存することはできません。Androidアプリの秘密鍵のハッキング防止ソリューションですか?

私はこの秘密鍵を保護することをどのように提案しますか?

私はそれをデータベースに保存しますが、電話機からデータベースを引き出すこともできます。

PS。このキーは特別なパラメータですので、重要なメソッドであり、誰にも知られていないことが重要です!解読鍵ではありません。この文字列は、暗号化方式(md5など)のパラメータとして使用され、その結果がインターネットサービスに送信されます。

EDIT

申し訳ありませんが、それは非常に複雑作るため。私は可能な限り少ない情報で回答を得ることができると思った。

このアプリでは、インターネットサービスにテキストを送信し、そのテキストをWebサイトに投稿することができます。どんなウェブロボットスクリプトでもアンドロイド電話を模倣して迷惑メールを投稿できるように、Androidの携帯電話経由でテキストが送信されるようにする必要があります。 captchaのようなメソッドは携帯電話では歓迎されないので、ハッシュコードを生成するためにmd5(他のものと一緒に)に置かれる秘密のキーがあります。このハッシュはインターネットサービスに送信されます。インターネットサービスは同じキーを使用してmd5結果を取得し、それを比較して送信者が携帯電話か一部のロボットかどうかを確認します。

これは本当に私が言うことができる最大です。私はそれが十分であることを望む。

+7

「誰にも知られていないことが重要です」本当に重要な場合は、アプリケーションにまったく含めることはできません。そうしないと、攻撃者はデバッガでコードをステップ実行し、コードが文字列を使用する時点で停止し、内容を検査することができます。攻撃者は文字列を解読する方法を知る必要はありませんが、コードを解読する代わりにAndroid開発ツールをインストールするだけです。 –

+0

@AdamMihalcinいいえ、この文字列は暗号化**に使用され、結果は他のインターネットサービスに送信されます。これは何か変わるでしょうか? – sandalone

+0

あなたがpswd/TANのような文字列を使用している場合は、銀行に一度使用しているコードを携帯電話に送り、これを使用する方法を調べることができます彼は新しいものを手に入れます。 @アダム・ミハルチン、どういう意味ですか?私は、コードを見ているかもしれないが、ロードされたアプリケーションをデバッグすることができます、これはどのように可能ですか? – user387184

答えて

10

セキュリティアーキテクチャを再考することをお勧めします。アプリに同梱されているものはすべて検出可能です。 (例えば、Androidのライセンス検証ライブラリは、公開鍵がアプリケーションと共に出荷されるように設計されています)

1つの可能性は、アプリケーションが安全なソケットまたはhttps接続を介してサーバーからキーを取得する可能性があります。これは明らかに、アプリケーションがサーバーに何らかの識別/検証(おそらくユーザー入力に基づいて)を提出することを要求します。

暗号化に鍵を使用している場合は、公開鍵の暗号化がどのように機能するのかをもう一度見てください。あなたのアプリにはの公開キーが必要です。インターネットサービスは、一致する秘密鍵で解読することができます。

+0

こんにちは、私は質問を編集しました。 "この文字列は暗号化方式(md5など)のパラメータとして使用され、結果はインターネットサービスに送信されます。" – sandalone

+0

@sandalone編集に対処するために私の答えに少し追加しました。 –

+0

回答を再度編集しました。 – sandalone

4

あなたが@ Adamのコメントで解決できるなら、私が知っている少なくとも1つの解決策があります。これは、電話機の文字列値を永続的に保持します。あなたのアプリの再インストール(工場出荷時の設定では削除されますが)は、ユーザーのために「隠されたまま」です(SD-Cardではなくシステムのプライベートストレージに保存されます)。あなたが行うことができます

final String myKey = "verySecretKey"; 
final String myValue = "verySecretValue"; 
final boolean isSuccess = System.putString(getContentResolver(), myKey, myValue); 

そして、それを取得するために:

myValue = System.getString(getContentResolver(), myKey); 

そして、はいを、根ざし電話便利に

あなたはそうのような値を格納するためのシステム設定コンテンツプロバイダを使用することができますユーザーは永続化された値を保持するかもしれませんが、その場合はもう何も神聖ではなく、@ Adamのコメントが有効になります。デバイスにデータを保存しないでください。

+0

回答を再度編集しました。 – sandalone

+0

これは実際に動作しますか?それは、そのようなハックのようであり、Androidが許さないもの(または将来のリリースで壊れるかもしれない)のようだ。 Settings.Systemは、アプリケーションの個人用ストレージではなく、システム設定用のものです。 – Tom

+0

はい、うまくいきます。特に、公開されているAPIが公開されているので、動作すると期待しています。また、ドキュメンテーション(http://developer.android.com/reference/android/provider/Settings.System.html)をチェックすると、 'putString'メソッドが「汎用キー入力」で有効になっているように見えることがあります。他の 'put ...'メソッドは主に既存のキーを変更するために使われているようです(しかしそれは解釈の問題かもしれません)。 – dbm