2010-11-09 70 views
9

Tôi hiện đang phát triển các dịch vụ RPC cho các nhà phát triển để sử dụng, nhưng muốn đảm bảo rằng tôi có thể phân biệt giữa khóa gỡ lỗi của ứng dụng khác và khóa công khai của ứng dụng. Có cách nào để kiểm tra khóa của ứng dụng khác và cho biết đó là khóa gỡ lỗi và KHÔNG phải là khóa ứng dụng đã xuất bản không?Có cách nào để kiểm tra xem chữ ký ứng dụng có được gỡ lỗi hay xuất bản không?

Mục đích của việc này là để có thể biết thời điểm ứng dụng của họ đang trong trạng thái phát triển hoặc phát hành, vì tôi cần biết có nên truy cập máy chủ dev hoặc máy chủ sản xuất của tôi hay không.

+0

Cả hai bạn đã cung cấp một số thông tin thực sự hữu ích. Bỏ phiếu cho cả hai câu trả lời. –

Trả lời

4

Theo mặc định, androiddebugkey được Eclipse sử dụng (ví dụ) có thời gian là notAfter & tối đa 1 năm trong tương lai - giá trị ngắn như vậy không được Android Market chấp nhận - bạn có thể sử dụng điều đó để phân biệt giữa nhà phát triển đã ký xây dựng? Hoặc .. bạn chỉ có thể kiểm tra khóa công khai mà ứng dụng sử dụng - yêu cầu họ ký các yêu cầu RPC với android.content.pm.Signature của ứng dụng của họ không?

 
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

Cảm ơn bạn đã trợ giúp! Nó đã quá lâu đến nỗi tôi gần như đã từ bỏ. Vấn đề ở đây là khóa là "theo mặc định" 1 năm. Tôi đã đặt các khóa gỡ lỗi của mình trong 25 năm ... Đây là lý do tại sao tôi cần phải có thể nói sự khác biệt. Có suy nghĩ gì không? –

+0

Tôi nghĩ đây là đường đi đúng. GetSubjectDN() chắc chắn là một khả năng. Bạn có thể cho tôi biết nơi bạn tìm thấy thông tin này, vì vậy tôi có thể nghiên cứu thêm một số thông tin khác không? –

+0

Sau khi thực hiện một số nghiên cứu thêm với hướng dẫn này, tôi đã đưa ra một giải pháp hiệu quả. Nó là đa phần, nhưng chiếm nhiều trường hợp nhất có thể. Đầu tiên là kiểm tra ngày. Sau đó, SubjectDN. Cuối cùng, trên một thất bại khác, tôi kết hợp Khóa công khai với Truy vấn thị trường. Chắc chắn, thậm chí không gần với một giải pháp đầy đủ, nhưng chứa phần lớn nhu cầu của tôi. Cảm ơn một lần nữa vì thông tin tuyệt vời này. –

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; 

} 

Chạy mã này lần đầu tiên bằng khóa gỡ lỗi, điều này sẽ trở lại sai, nhưng bạn sẽ nhận được khóa được mã hóa trong Logcat. Sao chép khóa được mã hóa và thay thế "khóa" giá trị của DEBUGKEY và nó sẽ hoạt động tốt.

+0

Bạn cần phải giải nén chữ ký, bằng cách sử dụng ví dụ javax.security.X509Certificate - sigs [0] .toCharsString() không trả về "androiddebugkey", nó trả về một chuỗi được mã hóa hex lớn. – Jens

+0

Xin lỗi, tôi đã trả lời xong. – xtr

+1

static final String DEBUGKEY = " key "; Dòng này dường như làm nổi bật rằng tôi đã biết khóa gỡ lỗi, tôi có đúng không? Nếu tôi, tôi không thể biết khóa gỡ lỗi vì nó được cung cấp bởi một nhà phát triển khác. Cách API của tôi hoạt động là đối với một ứng dụng gỡ lỗi, nó miễn phí để sử dụng với thử nghiệm, nhưng đối với một ứng dụng được xuất bản, nhà phát triển phải trả một khoản phí tối thiểu để tích hợp. Điều quan trọng là tôi biết liệu khóa là gỡ lỗi hay được xuất bản mà không biết khóa là gì. –

Các vấn đề liên quan