2012-12-29 16 views
11

アプリの課金v3で使用するアプリの開発が完了しました。私のアプリは、データベースに挿入される質問のリストを持っている試験のヘルプアプリです。私を心配することは、秘密を超えてセキュリティがあるということです。私のアプリは購入したアイテムの在庫を照会するので、購入の保管には問題はありません。アプリ課金のセキュリティ

最初の問題は誰かが(私がやった)アプリケーションを逆コンパイルすることができますし、プロガードを使ってもすべての質問を検索するのが難しくありません。

次はアプリケーションの公開鍵です。これは簡単に私のアプリから取得することができ、開発者のガイドによると、これは私が安全を保つ必要があります。

しかし、どのようにセキュリティを実装するかはわかりません。あるいは、どれくらい私が安全保障で行くべきか。サーバーがなければ、デバイス上のすべてを管理していれば、完璧ではない(それから遠い)が、少なくともハッカーは面白いというよりも抑止されることを望むだろう。

だから、基本的に問題は:

私はセキュリティのどのようなタイプを使用する必要がありますし、それはどのように使用されていますか?ちょうど私がそれが驚くべきであることを理解することができるように、ステップバイステップを通過するリンクに私を向ける。

ありがとうございました!

説明:

関連するサーバーはありません。データはアプリに保存されます。インベントリがクエリされると(queryinventoryasyncメソッドを通じて)、インベントリが購入されたかどうかが返されます。これは、アプリケーションが起動するたびに実行されます。アプリの課金自体は大丈夫です、私は自分のアプリケーションについてアプリケーションの公開鍵についてもっと尋ねています - 何とかそれをコピーするのは難しいですが、現在私はそれを15文字列に分割しています。実行時にそれらをお互いに共有することができます。私はそれをどうにかして暗号化したいのですが、ちょうど方法がわかりません。

+0

http://stackoverflow.com/questions/14352758/android-in-app-billing-securing-application-public-key – Krishnabhadra

答えて

18

良い質問です。

公開キーは、使用するにはデバイス上で利用可能である必要があります。それがデバイス上に来たら、それはもはや本当に保護されていません。鍵そのものは秘密ではありませんが、私たちは可能な代替物をより困難な仕事にする必要があります。

あなたができることは、いわゆるXOR暗号化を使用することです。 XORの暗号化と復号化の方法がある場合の例を次に示します。何が必要なのパスワード文字列(String key)を選択し、それを使用して、あなたの公開鍵(String input)を暗号化するためにどのように

public static String xorEncrypt(String input, String key) { 
    byte[] inputBytes = input.getBytes(); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(Base64.encode(outBytes, Base64.DEFAULT)); 
} 

public static String xorDecrypt(String input, String key) { 
    byte[] inputBytes = Base64.decode(input, Base64.DEFAULT); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(outBytes); 
} 

。この暗号化された鍵は、クラスに格納できます。実際のキー値が必要な場合は、パスワードとパブリック(暗号化された)キー文字列を使用してxorDecrypt()に電話します。パスワードはコードのどこかに格納する文字列です。私が言ったように、私たちは本当にそれを守るわけではありませんが、私たちはそれを見つけて/または置き換えるのをより困難にします。

暗号化された公開鍵とパスワードを組み合わせる方法について、より洗練されたロジックを追加できます。これはちょっと複雑ですが、あなたの鍵は解読されません。どんな場合でも、Google confirms XOR暗号化は何もないより優れています。

Android 4.3に公開鍵の保存にも使用できるセキュリティ機能が追加されました。このソリューションでは、サーバーの通信とハードウェアのサポートが本当に安全である必要があります。これらはKey Chain enhancements and Android Keystore Providerです。

+0

恐ろしい答え。また、私は暗号化された公開鍵を、文字列を逆にしたり、文字をシャッフルしたりして組み合わせるさまざまな部分に分割する必要がありますか?私が理解していることは、誰かが自分の鍵をあなたのものに置き換えるのをやめて、アイテムを購入して得た資金を自分のアカウントに転用することです。 – AndroidPenguin

+1

ありがとう! a)はい、暗号化された公開鍵も分割することができます。これは、ハッカーの生活をより困難にするか、あるいはもっと面白いかもしれません。 b)そうではありません。その考え方は、あなたの公開鍵を偽のものに置き換えることをより困難にすることです。その後、アプリケーションを再構築して、偽のサーバの応答を受け入れるようにします。したがって、ハッカーはそれらを支払うことなく機能を有効にすることができます。 –

+0

'int keySize = keyBytes.length - 1;'これはネセサリーではない。 i%keySizeは常にkeySizeよりも小さいので、1の場合はkeySizeをマイナスにする必要はありません –

関連する問題