2010-11-09 72 views
9

我目前正在爲開發人員開發使用RPC服務,但希望確保我可以區分另一個應用程序的調試密鑰和他們的公鑰。有沒有辦法檢查另一個應用程序的密鑰,並告訴它是否是調試密鑰而不是已發佈的應用程序密鑰?有沒有辦法檢查應用程序簽名是否調試或發佈?

這樣做的目的是爲了能夠告訴當他們的應用程序正在開發或釋放狀態,我需要能夠告訴他們是否應該訪問我的dev的服務器或我的生產服務器。

+0

你們都提供了一些非常有用的信息。表決兩個答案。 – 2011-10-11 15:52:44

回答

4

默認情況下,Eclipse使用的androiddebugkey(例如)具有notAfter日期&時間,未來至多1年 - Android Market不接受這種短時間值 - 您可以使用它來區分開發者簽署了構建?或者..你可以檢查應用程序使用的publickey - 讓他們用他們的應用程序的android.content.pm.Signature簽署RPC請求?

 
PackageInfo pkgInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES); 

for (Signature appSignature : pkgInfo.signatures) { 
    // javax.security - NOT java.security! 
    X509Certificate appCertificate = X509Certificate.getInstance(appSignature.toByteArray()); 
    // appCertificate.getNotAfter() can give you the date & time the cert expires 
    // appCertificate.getPublicKey() can give you the public key you sign the RPC requests with. 
    // appCertificate.getSubjectDN() will give you a Principal named "CN=Android Debug,O=Android,C=US" for any debug certificate that hasn't been handcrafted by the developer. 
} 
+0

謝謝你的幫助!它已經很久了,我幾乎已經放棄了。這裏的問題是關鍵是「默認」1年。我已經設置了25年的調試密鑰......這就是爲什麼我需要能夠分辨出差異。有什麼想法嗎? – 2011-10-11 15:40:50

+0

我認爲這是正確的軌道。 getSubjectDN()絕對是一種可能性。你能告訴我你在哪裏找到這些信息,所以我可以再研究一下嗎? – 2011-10-11 15:46:34

+0

用這個指導做了一些進一步的研究後,我想出了一個有效的解決方案。它是多方面的,但儘可能多地考慮了情況。首先是檢查日期。然後,SubjectDN。最後,在另一次失敗時,我將公鑰視爲市場查詢。當然,甚至沒有接近完整的解決方案,但可以滿足我的大部分需求。再次感謝這個令人敬畏的信息。 – 2011-10-11 21:50:18

4
static final String DEBUGKEY = 
     " key ";  


public static boolean signedWithDebugKey(Context context, Class<?> cls) 
{ 
    boolean result = false; 
    try { 
     PackageInfo pinfo = context.getPackageManager().getPackageInfo("your package name",PackageManager.GET_SIGNATURES); 
     Signature sigs[] = pinfo.signatures; 

     Log.d(TAG,sigs[0].toCharsString()); 

     if (DEBUGKEY.equals(sigs[0].toCharsString())) { 
      result = true; 
      Log.d(TAG,"package has been signed with the debug key"); 
     } else { 
      Log.d(TAG,"package signed with a key other than the debug key"); 
     } 

    } catch (android.content.pm.PackageManager.NameNotFoundException e) { 
     return false; 
    } 

    return result; 

} 

第一次使用debugkey運行此代碼,這將總是返回false,但您會在Logcat中獲得編碼密鑰。 複製該編碼密鑰,並替換DEBUGKEY的值「key」,它會正常工作。

+0

您需要解壓縮簽名,例如使用javax.security.X509Certificate - sigs [0] .toCharsString()不會返回「androiddebugkey」,它會返回一個大的十六進制編碼的字符串。 – Jens 2011-10-03 09:12:08

+0

對不起,我修復了答案。 – xtr 2011-10-03 09:55:33

+1

static final String DEBUGKEY = " key ";這行似乎暗示我已經知道調試密鑰,我是否正確?如果我是,我不可能知道調試密鑰,因爲它是由另一個開發人員提供的。我的API的工作方式是,對於調試應用程序,它可以免費用於測試,但對於已發佈的應用程序,開發人員必須支付最低的費用才能進行集成。重要的是我知道密鑰是調試還是發佈而不知道密鑰是什麼。 – 2011-10-11 15:42:06

相關問題