8

http://developer.android.com/guide/google/play/billing/billing_integrate.html#billing-signaturesからのこのちょっとしたアドバイスに混乱しています

公開鍵を悪意のあるユーザーやハッカーから保護するには、公開鍵を完全なリテラル文字列として埋め込まないでください。代わりに、実行時に断片から文字列を構築するか、ビット操作 (たとえば、他の文字列との XOR) を使用して実際のキーを非表示にします。キー自体は機密情報ではありませんが、ハッカーや悪意のあるユーザーが公開キーを別のキーに簡単に置き換えられるようにしたくはありません。

ということですか

String one = "thisIs";
String two = "MyKey";
String base64EncodedPublicKey = one + two;
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey);
verified = Security.verify(key, signedData, signature);

よりも安全です

String base64EncodedPublicKey = "thisIsMyKey";
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey);
verified = Security.verify(key, signedData, signature);

? そうでない場合は、これを行う方法のコードの例を教えてください。

4

2 に答える 2

4

キーの重大な変更を伴うものが最適です。個人的には、暗号化を使用することを好みます。このようなものが機能します。キーの場合は、いくつかのパーツをつなぎ合わせると、まとめやすくなります。encryptKey を使用してキーを暗号化し、ソース コードから実際のキーを削除すると、かなり安全になります。セキュリティで保護されたサーバーから何らかの方法でキーを取得することをお勧めしますが、それが常にオプションであるとは限りません。

String encryptKey(String input)
{
    byte[] inBytes=input.getBytes();
    String finalString=null;
    try {
        Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] keyBytes=md.digest((KeyPart1+KeyPart2).getBytes());
        keyBytes = Arrays.copyOf(keyBytes, 16);
        SecretKey key= new SecretKeySpec(keyBytes,"AES");
        IvParameterSpec ivSpec = new IvParameterSpec(new byte[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0});
        cipher.init(Cipher.ENCRYPT_MODE,key,ivSpec);
        byte[] outBytes = new byte[cipher.getOutputSize(inBytes.length)];
        //cipher.update(encrypted, 0, encrypted.length, decrypted, 0);
        outBytes=cipher.doFinal(inBytes);
        finalString=new String(Base64.encode(outBytes,0));
        Log.v(TAG,"Encrypted="+finalString);

    } catch (NoSuchAlgorithmException e) {
        Log.e(TAG,"No Such Algorithm",e);
    } catch (NoSuchPaddingException e) {
        Log.e(TAG,"No Such Padding",e);
    } catch (InvalidKeyException e) {
        Log.e(TAG,"Invalid Key",e);
    } catch (InvalidAlgorithmParameterException e) {
        Log.e(TAG,"Invalid Algorithm Parameter",e);
    } catch (IllegalBlockSizeException e) {
    } catch (BadPaddingException e) {}
    return finalString;
}

String decryptKey(String base64Text)
{
    byte[] encrypted=Base64.decode(base64Text,0);
    //encrypted=base64Text.getBytes();
    String decryptedString=null;
    try {
        Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] keyBytes=md.digest((KeyPart1+KeyPart2).getBytes());
        keyBytes = Arrays.copyOf(keyBytes, 16);
        SecretKey key= new SecretKeySpec(keyBytes,"AES");
        IvParameterSpec ivSpec = new IvParameterSpec(new byte[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0});
        cipher.init(Cipher.DECRYPT_MODE,key,ivSpec);
        byte[] decrypted = new byte[cipher.getOutputSize(encrypted.length)];
        //cipher.update(encrypted, 0, encrypted.length, decrypted, 0);
        decrypted=cipher.doFinal(encrypted);
        decryptedString=new String(decrypted);
    } catch (NoSuchAlgorithmException e) {
        logStackTrace(e);
    } catch (NoSuchPaddingException e) {
        logStackTrace(e);
    } catch (InvalidKeyException e) {
        logStackTrace(e);
    } catch (InvalidAlgorithmParameterException e) {
        logStackTrace(e);
    } catch (IllegalBlockSizeException e) {
        logStackTrace(e);
    } catch (BadPaddingException e) {
        logStackTrace(e);
    }
    return decryptedString;
}
于 2013-12-11T02:48:22.327 に答える
3

はい。この場合、文字列を連結しているだけですが、あまり良くありません。その理由は、誰かがあなたのコードを簡単に逆アセンブルして公開鍵にアクセスできるからです。キーを再アセンブルする必要がある場合、逆アセンブルされたコードからキーを取得するのが非常に難しくなります。

于 2012-08-27T21:09:45.557 に答える