2011-04-07 12 views
53

क्या एपीके पर हस्ताक्षर करने के लिए उपयोग की जाने वाली कुंजी के हस्ताक्षर को पुनर्प्राप्त करने का कोई तरीका है? मैंने अपने कीस्टोर से अपनी कुंजी के साथ अपने एपीके पर हस्ताक्षर किए। मैं इसे प्रोग्रामेटिक रूप से कैसे प्राप्त कर सकता हूं?एपीके हस्ताक्षर हस्ताक्षर कैसे प्राप्त करें?

+0

आप इसे साइन करने के लिए एक चींटी स्क्रिप्ट का उपयोग कर सकते हैं। लेकिन इसके लिए आपको अपने पासवर्ड कहीं भी स्टोर करने की आवश्यकता होगी जो असुरक्षित है। – clamp

+0

मुझे बस इसके अंदर अपने ऐप से हस्ताक्षर प्राप्त करने की आवश्यकता है, उदा। मेरी पहली गतिविधि में मैं किसी भी तरह से अपना ऐप हस्ताक्षर प्राप्त करता हूं। अब तक मुझे नहीं पता कि कैसे – Waypoint

+0

आह मैं समझता हूं। मुझे यकीन नहीं है कि यह संभव है या नहीं। – clamp

उत्तर

59

आप PackageManager वर्ग http://developer.android.com/reference/android/content/pm/PackageManager.html

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures; 
for (Signature sig : sigs) 
{ 
    Trace.i("MyApp", "Signature hashcode : " + sig.hashCode()); 
} 

मैं इस का उपयोग किया है मेरी डिबग कुंजी के लिए hashCode के साथ तुलना करने का उपयोग कर, की पहचान करने के APK नहीं है कि क्या इस तरह APK के हस्ताक्षर हस्ताक्षर का उपयोग कर सकते एक तरीके के रूप एक डीबग एपीके या एक रिलीज एपीके।

+0

आप कैसे जानते हैं कि यह डीबग या रिलीज कुंजी के साथ हस्ताक्षरित है या नहीं? मुझे मिलता है: 08-08 08: 24: 36.668: I/Platform (1 9 131): हस्ताक्षर हैशकोड: -1907392821 मुझे यह भी नहीं पता कि यह कैसे सत्यापित किया जाए कि यह मेरा पैकेज है या नहीं ... (I यह सत्यापित करने की आवश्यकता है कि com.mypackage.myapp मुझसे संबंधित है या नहीं) – Zennichimaro

+0

http://stackoverflow.com/questions/6122401/android-compare-ignature-of-current-package-with-debug-keystore?rq=1 मुझे डीबग या रिलीज एपीके के बीच अंतर करने देता है, लेकिन क्या एपीके वास्तव में मुझसे आता है यह सत्यापित करने के लिए मेरी सार्वजनिक कुंजी के खिलाफ मेरे हस्ताक्षर को सत्यापित करने का कोई तरीका है? धन्यवाद! – Zennichimaro

+10

कोई स्थापित एप्लिकेशन के हस्ताक्षर प्राप्त करने का कोई तरीका नहीं है? उदाहरण के लिए यदि मेरे पास .apk फ़ाइल – Ruzard

24

पैकेज प्रबंधक आपको किसी भी स्थापित पैकेज के लिए हस्ताक्षर प्रमाणपत्र देगा। फिर आप हस्ताक्षर कुंजी के विवरण प्रिंट कर सकते हैं, उदा।

final PackageManager packageManager = context.getPackageManager(); 
final List<PackageInfo> packageList = packageManager.getInstalledPackages(PackageManager.GET_SIGNATURES); 

for (PackageInfo p : packageList) { 
    final String strName = p.applicationInfo.loadLabel(packageManager).toString(); 
    final String strVendor = p.packageName; 

    sb.append("<br>" + strName + "/" + strVendor + "<br>"); 

    final Signature[] arrSignatures = p.signatures; 
    for (final Signature sig : arrSignatures) { 
     /* 
     * Get the X.509 certificate. 
     */ 
     final byte[] rawCert = sig.toByteArray(); 
     InputStream certStream = new ByteArrayInputStream(rawCert); 

     try { 
      CertificateFactory certFactory = CertificateFactory.getInstance("X509"); 
      X509Certificate x509Cert = (X509Certificate) certFactory.generateCertificate(certStream); 

      sb.append("Certificate subject: " + x509Cert.getSubjectDN() + "<br>"); 
      sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "<br>"); 
      sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "<br>"); 
      sb.append("<br>"); 
     } 
     catch (CertificateException e) { 
      // e.printStackTrace(); 
     } 
    } 
} 
+0

संबंधित धारावाहिक संख्या के साथ फ़ाइल को सत्यापित करने का आदेश क्या है: unzip -p [path_to_apk] मेटा-आईएनएफ/सीईआरटी.आरएसए | keytool -printcert – JY2k

0

मेरी स्थिति यह है कि मेरे पास एक पूर्व-स्थापित एपीके है जो गलत कुंजी-स्टोर का उपयोग करता है। तो सीधे स्थापित करने से असंगत हस्ताक्षर की वजह से असफल हो जाएगा। मुझे यह सुनिश्चित करने के लिए पहले हस्ताक्षर की जांच करनी होगी कि इसे आसानी से इंस्टॉल किया जा सके।

यहां मेरा समाधान है।

this code कहता है, आप एक स्थापित एपीके से हस्ताक्षर प्राप्त कर सकते हैं।

विवरण:

Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0]; 

दूसरी बात: releaseApk hashCode तुलना करने के लिए मिलता है। मेरे मामले में, मैंने अपने सर्वर से यह एपीके डाउनलोड किया, और इसे sd_card में रखा।

Signature releaseSig = context.getPackageManager().getPackageArchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0]; 

अंत में, हैशकोड की तुलना करें।

return sig.hashCode() == releaseSig.hashCode; 

मैंने ऊपर दिए गए कोड को आजमाया है, यह ठीक काम करता है। यदि हैशकोड अलग है, तो आपको केवल uninstall पुराना एपीके होना चाहिए या यदि यह एक सिस्टम ऐप है और डिवाइस रूट है, तो आप केवल रनटाइम का उपयोग remove it पर कर सकते हैं, और फिर नया हस्ताक्षर एपीके इंस्टॉल कर सकते हैं।

+1

getPackageArchiveInfo, getPackageAchiveInfo नहीं – frogoscar

संबंधित मुद्दे