码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 获取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,报错就用下面的源码自撸吧。

    源码:

    1. public class Main {
    2. private static final String CERTIFICATE_TYPE_NAME = "X.509";
    3. public static void main(String[] args) {
    4. String path, password, alias;
    5. if (args.length == 3) {
    6. path = args[0];
    7. password = args[1];
    8. alias = args[2];
    9. } else {
    10. System.out.println("error, must fill path, password, alias params");
    11. return;
    12. }
    13. System.out.println("path: " + path + ", password:" + password + ", alias:" + alias);
    14. try {
    15. FileInputStream is = new FileInputStream(path);
    16. KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
    17. char[] passwd = password.toCharArray();
    18. keystore.load(is, passwd);
    19. Certificate cert = keystore.getCertificate(alias);
    20. String type = cert.getType();
    21. RSAPublicKey pub = (RSAPublicKey) cert.getPublicKey();
    22. String modulus = pub.getModulus().toString(10);
    23. System.out.println("modulus: " + modulus);
    24. if (CERTIFICATE_TYPE_NAME.equals(type) && cert instanceof X509Certificate) {
    25. X509Certificate x509cert = (X509Certificate) cert;
    26. String md5 = getThumbPrint(x509cert, "MD5");
    27. System.out.println("md5: " + md5);
    28. }
    29. } catch (Exception e) {
    30. e.printStackTrace();
    31. }
    32. }
    33. public static String getThumbPrint(X509Certificate cert, String type)
    34. throws NoSuchAlgorithmException, CertificateEncodingException {
    35. MessageDigest md = MessageDigest.getInstance(type);
    36. byte[] der = cert.getEncoded();
    37. md.update(der);
    38. byte[] digest = md.digest();
    39. return hexify(digest);
    40. }
    41. public static String hexify(byte[] bytes) {
    42. char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    43. StringBuilder buf = new StringBuilder(bytes.length * 3);
    44. for (byte aByte : bytes) {
    45. buf.append(hexDigits[(aByte & 0xf0) >> 4]);
    46. buf.append(hexDigits[aByte & 0x0f]);
    47. buf.append(' ');
    48. }
    49. return buf.toString();
    50. }
    51. }

  • 相关阅读:
    selenium 下载文件取消安全下载的方法
    前端规范——前端代码提交篇(2)
    mybatis中判断传入的数组与集合是否为空+mybatis中Foreach的使用详解
    Blazor/Hybird 触屏下单程序调优笔记
    解决:idea中代码文件背景变成特殊颜色(浅褐色),且代码智能提示完全消失,即使在新项目中创建同类型文件也会出现同样情况
    桶排序(Bucket Sort)
    hm商城微服务远程调用及拆分
    计算机网络
    税收学专业论文应该怎样选择题目能更好的完成毕业论文?
    java毕业生设计在线直播平台计算机源码+系统+mysql+调试部署+lw
  • 原文地址:https://blog.csdn.net/luozhi3527/article/details/133315993
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号