Уточнение общедоступного ключа Android?

Я смущен этим советом от 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); 

? Если нет, не могли бы вы дать мне пример в коде, как это сделать?

Да. Хотя в этом случае вы просто конкатенируете строки, которые не намного лучше. Причина этого в том, что кто-то может легко разобрать ваш код и получить доступ к вашему открытому ключу. Если вам нужно собрать ключ, это значительно усложняет захват ключа из разобранного кода.

Что-то, что связано с серьезным изменением ключа, лучше всего. Лично я предпочитаю использовать шифрование, что-то вроде этого будет работать. Для ключа соедините несколько частей, и это должно помочь собрать его. Используйте 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; } 
Intereting Posts
ListView onItemClickListener не вызывается Как проверить программно, если приложение установлено или нет в Android? Последний незавершенный блок с CipherInputStream / CipherOutputStream, даже с дополнением AES / CBC / PKCS5Padding Службы Google Play Game. Настройка проекта LibGDX с помощью новейших BaseGameUtils. Диалоговое окно «Facebook Share» на Android, не показывающем контент (Модернизация) Не удалось найти конвертер для приложения для разбивки класса Почему элемент «share-to» вышел в Android 4.0.3 PHONE HTC OneX Галерея QuiltView с Pull to Refresh в Android? Упаковка приложений для приложений для Android не соответствует вкусам Как перейти для обновления токена автоматически, когда токен доступа истек и получить 401, используя HttpURLConnection в android? Android Yuv420sp для ARGB в OpenCV Ведение позиции Drag & Dropped при перезапуске Android Native crash в /system/lib/libskia.so Можете ли вы центрировать кнопку в RelativeLayout? Google Chrome на Android (и только Android) Не позволяет Decimal с номером типа и step = "any"