8

アプリの実際の公開鍵をこの変数の値に貼り付ける必要がありますか?

または、それをエンコードしてから、エンコードされた文字列が何であれ、その文字列をこの変数の値にする必要がありますか?

それはどれですか?

4

4 に答える 4

4

Android デベロッパー コンソール (「プロファイルの編集」の下にあります) にある公開鍵は、すでに Base64 でエンコードされています。ソースファイルにキーの内容をコピーして貼り付けるだけです。たとえば、次のようなものがあるとします。

ここに画像の説明を入力

次に、あなたのSecurity.java

String base64EncodedPublicKey = "MIIBIjANBgkqhkiG9w0BAQ......";
于 2012-07-14T03:25:00.517 に答える
2

アプリ内課金の Google サンプル コードにあるように、この公開鍵を難読化する必要があります。

ここにプログラムに埋め込まれたリテラル文字列全体を格納するだけでなく、実行時に断片からキーを構築するか、ビット操作 (たとえば、他の文字列との XOR) を使用して実際のキーを非表示にします。キー自体は秘密情報ではありませんが、攻撃者が公開キーを自分のキーに簡単に置き換えて、サーバーからのメッセージを偽造できるようにしたくありません。

非常に単純な Java コードを使用して、公開鍵を返す Java クラスを生成します。基本的な考え方は、再帰を使用して、内部静的クラスを使用してキーを再作成することです。それはただの考えの材料です

それは私のニッチ市場にとって「十分な」アプローチです. 難読化の詳細については、この stackexchange のセキュリティに関する質問を参照してください。

public static void main(String[] args) throws Exception {
    String className = genClassName();
    PrintWriter writer = new PrintWriter("C:\\" + className + ".java", "iso-8859-1");
    printClass(className, writer, "XXXXXX-YOUR-PUBLIC-KEY-GOES-HERE-XXXXXXX", true);
    writer.close();
}

private static String genClassName() {
    return "Class" + UUID.randomUUID().toString().replaceAll("-", "");
}

private static String printClass(String thisClass, PrintWriter writer, String key, boolean root) {
    int split = key.length() / 2;
    if (split < 10) {
        writer.println("public " + (root ? "" : "static") + " class " + thisClass + " {");
        writer.println("public static String get() {");
        writer.println("return \"" + key + "\";");
        writer.println("}");
        writer.println("}");
    } else {
        String first = key.substring(0, split);
        String last = key.substring(split, key.length());
        writer.println("public " + (root ? "" : "static") + " class " + thisClass + " {");
        String class1 = printClass(genClassName(), writer, first, false);
        String class2 = printClass(genClassName(), writer, last, false);
        writer.println("public static String get() {");
        writer.println("return " + class1 + ".get() + " + class2 + ".get();");
        writer.println("}");
        writer.println("}");
    }

    return thisClass;
}
于 2014-06-27T09:31:03.730 に答える
1

署名を確認できるように、プログラムのソースコードに公開鍵が必要です。はい、クラッカーがそれを見つけて偽物と交換し、プログラムに偽物の購入品を供給するという、ゼロ以外の避けられないリスクがあります。

詮索好きな目から鍵を完全に隠すことはできませんが、難読化することはできます。Base64文字列をさまざまな場所でいくつかの文字列定数に分割し、使用する前にそれらを連結することができます。チャンクに目立たない名前を付ける方がよいでしょう(のようにではありませんMY_PUBLIC_KEY_PART_4)。ソフト暗号化の追加レイヤーを適用することもできます-XOR値のようなものです。整合性チェックを追加できます-キーがスプーフィングされていないことを確認します(たとえば、キーのハッシュを他の場所に保存してチェックします)。しかし、これはすべて、隠すことによるセキュリティです。十分に決心したハッカーが通り抜けることができます。

組み込みのコード難読化ツールであるProGuardも検討してください。

于 2012-07-14T03:56:20.613 に答える
0

アプリの一部としてサーバー コンポーネントがある場合は、公開鍵を含むほとんどのセキュリティ要素をサーバーに移動できます。サーバー上でノンスを生成し、購入を確認できます (私は RESTFul WCF サービスに移動しました)。RNGCryptoServiceProviderサーバー コンポーネントが .NET ベースの場合、クラスを使用できるように、公開キーからモジュラスと指数を生成する必要があります。とりわけアプリ内課金の概要を説明する Google I/O ビデオがあります。

于 2012-07-17T20:28:05.210 に答える