2012-08-27 24 views
7

Tôi bối rối bởi bit này lời khuyên từ http://developer.android.com/guide/google/play/billing/billing_integrate.html#billing-signaturesLàm rõ về khóa công khai của Android?

Để giữ chìa khóa công cộng của bạn an toàn từ những người dùng độc hại và tin tặc, đừng nhúng khóa công khai của bạn như toàn bộ một chuỗi chữ. Thay vào đó, hãy xây dựng chuỗi tại thời gian chạy từ các đoạn hoặc sử dụng thao tác bit (ví dụ , XOR với một số chuỗi khác) để ẩn khóa thực. Chính chính nó không phải là thông tin bí mật, nhưng bạn không muốn làm cho nó dễ dàng cho một hacker hoặc người dùng độc hại để thay thế khóa công khai bằng một khóa khác.

Điều này có nghĩa rằng

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

là an toàn hơn

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

? Nếu không, bạn có thể xin vui lòng cho tôi một ví dụ trong mã làm thế nào để làm điều này?

+1

+1 Câu hỏi này không nên được giảm giá. – hpique

+0

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

Trả lời

3

Có. Mặc dù trong trường hợp này, bạn chỉ cần ghép các chuỗi không tốt hơn nhiều. Lý do cho điều này là ai đó có thể dễ dàng tháo rời mã của bạn và truy cập khóa công khai của bạn. Nếu bạn phải lắp ráp lại chìa khóa, nó sẽ làm cho nó khó khăn hơn nhiều để lấy chìa khóa ra khỏi mã tháo rời.

4

Điều gì đó liên quan đến một số thay đổi quan trọng của khóa là tốt nhất. Cá nhân, tôi thích sử dụng mã hóa, một cái gì đó như thế này sẽ làm việc. Đối với chìa khóa, chuỗi lại với nhau một vài phần, và nó sẽ giúp đỡ để có được nó với nhau. Sử dụng encryptKey để mã khóa của bạn được mã hóa, sau đó xóa khóa thực khỏi mã nguồn và bạn nên khá an toàn. Tốt hơn là bằng cách nào đó lấy chìa khóa từ một máy chủ bảo mật, nhưng đó không phải lúc nào cũng là một lựa chọn.

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

Nhưng bạn chỉ có thể thực hiện yêu cầu thủ công cho máy chủ để lấy khóa đúng không? – Denny