程式獲取Android簽名

mymdeep發表於2017-02-08

關於Android簽名的基本概念,我在之前的文章已經提過:
Android如何簽名

如果不明白的朋友可以先看看。
我們在註冊一些應用的時候都是需要我們輸入簽名的,如:

  • 要求上傳MD5簽名的
    程式獲取Android簽名
  • 要求上傳Key Hashes的
    程式獲取Android簽名
  • 還有要求上傳SHA1簽名的

但是這個簽名應該如何獲取呢?

通過一些三方應用獲取

首先就是通過一些三方應用獲取,比如在分享授權中需要使用簽名,友盟的分享,就為開發者提供了簽名獲取工具

程式獲取Android簽名

這個簽名工具可以查詢三種簽名。

自己通過程式獲取

MD5簽名

這個沒有什麼好說的,我就直接附程式碼吧,需要注意的是,要想獲取應用簽名,需要應用的包名,通過包名可以得到PackageInfo

 /**
     * 獲取簽名的MD5摘要
     */
    public static String getSignatureDigest(PackageInfo pkgInfo) {
        int length = pkgInfo.signatures.length;
        if (length <= 0) {
            return "";
        }

        Signature signature = pkgInfo.signatures[0];
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            // Should not occur
        }
        byte[] digest = md5.digest(signature.toByteArray()); // get digest with md5 algorithm
        return toHexString(digest);
    }
 /**
     * 將位元組陣列轉化為對應的十六進位制字串
     */
    private static String toHexString(byte[] rawByteArray) {
        char[] chars = new char[rawByteArray.length * 2];
        for (int i = 0; i < rawByteArray.length; ++i) {
            byte b = rawByteArray[i];
            chars[i * 2] = HEX_CHAR[(b >>> 4 & 0x0F)];
            chars[i * 2 + 1] = HEX_CHAR[(b & 0x0F)];
        }
        return new String(chars);
    }
 private static final char[] HEX_CHAR = {
            '0', '1', '2', '3', '4', '5', '6', '7',
            '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
    };複製程式碼

這時候我們得到的字串就是MD5簽名,各個平臺需要填寫的簽名都是全小寫的,通過toLowerCase再轉成小寫即可。

KeyHash

 private static String facebookHashKey(PackageInfo info) {
        try {
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                return Base64.encodeToString(md.digest(), Base64.DEFAULT);
            }
        } catch (NoSuchAlgorithmException e) {
        }
        return null;
    }複製程式碼

有人可能會問函式名為什麼叫facebookHashKey,其實當時在用的時候是需要為Facebook的授權提供KeyHash,後來發現許多國外平臺都需要這個,而國內平臺需要的簽名都是MD5

SHA1

public static String getCertificateSHA1Fingerprint(PackageInfo packageInfo) {
        Signature[] signatures = packageInfo.signatures;
        byte[] cert = signatures[0].toByteArray();

        InputStream input = new ByteArrayInputStream(cert);
        CertificateFactory cf = null;
        try {
            cf = CertificateFactory.getInstance("X509");
        } catch (CertificateException e) {
            e.printStackTrace();
        }

        X509Certificate c = null;
        try {
            c = (X509Certificate) cf.generateCertificate(input);
        } catch (CertificateException e) {
            e.printStackTrace();
        }
        String hexString = null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA1");
            byte[] publicKey = md.digest(c.getEncoded());
            hexString = byte2HexFormatted(publicKey);
        } catch (NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        } catch (CertificateEncodingException e) {
            e.printStackTrace();
        }
        return hexString;
    }
  private static String byte2HexFormatted(byte[] arr) {
        StringBuilder str = new StringBuilder(arr.length * 2);
        for (int i = 0; i < arr.length; i++) {
            String h = Integer.toHexString(arr[i]);
            int l = h.length();
            if (l == 1)
                h = "0" + h;
            if (l > 2)
                h = h.substring(l - 2, l);
            str.append(h.toUpperCase());
            if (i < (arr.length - 1))
                str.append(':');
        }
        return str.toString();
    }複製程式碼

這種加密方式的簽名現在知道的只有一個俄羅斯平臺在使用。其他很少有使用這種加密方式的。
更多的開發知識,可以關注我的公眾號:

程式獲取Android簽名

相關文章