获取keystore中的公钥模数及md5

app备案时需要使用apk中的签名公钥,以及md5,但官方提供的方法是使用jadxGUI去打开apk获取:

填写App特征信息_备案-阿里云帮助中心

 实际生产中apk都没有可能就要走备案流程。

但其实公钥模数和md5不需要apk,只需要keystore就行了。

这里自撸了一个jar来输出keystore的公钥模数与md5。

下载链接:

https://download.csdn.net/download/luozhi3527/88377524

jar包使用很简单:

java -jar ParseKeystore-1.0.jar keystorePath password alias

回车即可得到keystore的模数与md5值:

需要注意的是,keystore的生成环境与解析环境要一致,否则可能导致失败。比如kesytore使用的jdk17生成的,然后在1.8环境下执行这个jar包就可能报错。

anyway,报错就用下面的源码自撸吧。

源码:

public class Main {
    private static final String CERTIFICATE_TYPE_NAME = "X.509";

    public static void main(String[] args) {
        String path, password, alias;
        if (args.length == 3) {
            path = args[0];
            password = args[1];
            alias = args[2];
        } else {
            System.out.println("error, must fill path, password, alias params");
            return;
        }
        System.out.println("path: " + path + ", password:" + password + ", alias:" + alias);
        try {
            FileInputStream is = new FileInputStream(path);
            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
            char[] passwd = password.toCharArray();
            keystore.load(is, passwd);
            Certificate cert = keystore.getCertificate(alias);
            String type = cert.getType();
            RSAPublicKey pub = (RSAPublicKey) cert.getPublicKey();
            String modulus = pub.getModulus().toString(10);
            System.out.println("modulus: " + modulus);
            if (CERTIFICATE_TYPE_NAME.equals(type) && cert instanceof X509Certificate) {
                X509Certificate x509cert = (X509Certificate) cert;
                String md5 = getThumbPrint(x509cert, "MD5");
                System.out.println("md5: " + md5);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String getThumbPrint(X509Certificate cert, String type)
            throws NoSuchAlgorithmException, CertificateEncodingException {
        MessageDigest md = MessageDigest.getInstance(type);
        byte[] der = cert.getEncoded();
        md.update(der);
        byte[] digest = md.digest();
        return hexify(digest);
    }

    public static String hexify(byte[] bytes) {
        char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        StringBuilder buf = new StringBuilder(bytes.length * 3);
        for (byte aByte : bytes) {
            buf.append(hexDigits[(aByte & 0xf0) >> 4]);
            buf.append(hexDigits[aByte & 0x0f]);
            buf.append(' ');
        }
        return buf.toString();
    }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值