程序获取Android签名

作者: mymdeep | 来源:发表于2017-02-08 10:26 被阅读261次

    关于Android签名的基本概念,我在之前的文章已经提过:
    Android如何签名

    如果不明白的朋友可以先看看。
    我们在注册一些应用的时候都是需要我们输入签名的,如:

    • 要求上传MD5签名的


    • 要求上传Key Hashes的


    • 还有要求上传SHA1签名的

    但是这个签名应该如何获取呢?

    通过一些三方应用获取

    首先就是通过一些三方应用获取,比如在分享授权中需要使用签名,友盟的分享,就为开发者提供了签名获取工具


    这个签名工具可以查询三种签名。

    自己通过程序获取

    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();
        }
    

    这种加密方式的签名现在知道的只有一个俄罗斯平台在使用。其他很少有使用这种加密方式的。
    更多的开发知识,可以关注我的公众号:

    相关文章

      网友评论

      • GoBg:高德地图就是用的sha1
        hunter886:刚好用到 谢谢了
        mymdeep:@Lhy巴扎嘿 嗯 是嘛 感谢提醒

      本文标题:程序获取Android签名

      本文链接:https://www.haomeiwen.com/subject/gidvittx.html