2012-08-27 11 views
7

Ben, kötü niyetli kullanıcılar ve korsanlara karşı güvende genel anahtarı tutmak için http://developer.android.com/guide/google/play/billing/billing_integrate.html#billing-signaturesAndroid genel anahtarıyla ilgili açıklama var mı?

tavsiye bu biraz karıştı bütün bir dize olarak ortak anahtarınızı katıştırmayın yoktur. Bunun yerine, çalışma zamanında dizede dizesini oluşturun veya gerçek anahtarı gizlemek için bit manipülasyonunu kullanın ( örneği için, başka bir dizeyle XOR). anahtarının kendisi gizli bilgi değildir, ancak bir hacker veya kötü niyetli kullanıcının ortak anahtarı başka bir anahtarıyla değiştirmesi için kodunu kolaylaştırmak istemezsiniz.

bu

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

daha güvenli

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

olduğu anlamına mı geliyor? Aksi halde, bunu nasıl yapacağınıza dair bir örnek verebilir misiniz?

+1

+1 Bu soru, kısaltılmış olmamalıdır. – hpique

+0

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

cevap

3

Evet. Bu durumda, sadece çok daha iyi olmayan dizeleri birleştiriyorsunuz. Bunun nedeni, birisinin kodunuzu kolayca söküp genel anahtarınıza erişebilmesidir. Anahtarı yeniden birleştirmeniz gerekiyorsa, sökülmüş koddan anahtarı almayı çok daha zor hale getirir.

4

Anahtarda ciddi değişikliklerin olduğu bir şey en iyisidir. Şahsen şifreleme kullanmayı tercih ediyorum, bunun gibi bir şey işe yarayacaktı. Anahtar için, birkaç parçayı birleştirin ve bir araya getirmeye yardımcı olmalısınız. Şifrelenmiş anahtarınızı almak için encryptKey kullanın, ardından gerçek anahtarı kaynak koddan silin ve oldukça güvenli olmalısınız. Bir şekilde anahtarı güvenli bir sunucudan almak daha iyidir, ancak bu her zaman bir seçenek değildir.

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; 
} 
+0

Ama yine de anahtarı almak için sunucuya manuel bir istekte bulunabilirsiniz? – Denny