查看Android打包时签名文件keystore的MD5值

2023-11-11

有些SDK提供方需要我们提供打包APK时使用的包名和签名文件(xxxxxx.jks这个文件)MD5值,然后SDK服务端应该会进行比对保证商户调用的合法性。不然光靠包名是可以伪造的,怎么获取签名文件的MD5值?

方法一:

原先通过命令keytool -list -v -keystore test.jks 可以查看md5值,但是发现现在查看不了,只有SHA1和SHA256的

方法二:改成从androidstudio查看

在app的build.gradle中配置你们签名文件,怎么生成签名文件?

build-->Generate signed bundle\APK-->next -->Create  new

android{

signingConfigs {
    release {
        keyAlias 'test'
        storePassword '666666'
        keyPassword '666666'
        storeFile file('E:\\test.jks')
    }
    debug {
        keyAlias 'test'
        storePassword '666666'
        keyPassword '666666'
        storeFile file('E:\\test.jks')
    }
}

}

右侧gradle Tasks里面双击signingReport就可以查看签名文件的MD5值了

获取后去掉 :

方法三:从PackageInfo类中获取

package com.chinapay.umsfacesdkdemo.utils;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.util.Log;

import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.HashMap;


/**
 * 获取签名工具类
 */
public class AppSigning {
    public final static String MD5 = "MD5";
    public final static String SHA1 = "SHA1";
    public final static String SHA256 = "SHA256";
    private static HashMap<String, ArrayList<String>> mSignMap = new HashMap<>();

    /**
     * 返回一个签名的对应类型的字符串
     *
     * @param context
     * @param type
     * @return 因为一个安装包可以被多个签名文件签名,所以返回一个签名信息的list
     */
    public static ArrayList<String> getSignInfo(Context context, String type) {
        if (context == null || type == null) {
            return null;
        }
        String packageName = context.getPackageName();
        if (packageName == null) {
            return null;
        }
        if (mSignMap.get(type) != null) {
            return mSignMap.get(type);
        }
        ArrayList<String> mList = new ArrayList<String>();
        try {
            Signature[] signs = getSignatures(context, packageName);
            for (Signature sig : signs) {
                String tmp = "error!";
                if (MD5.equals(type)) {
                    tmp = getSignatureByteString(sig, MD5);
                } else if (SHA1.equals(type)) {
                    tmp = getSignatureByteString(sig, SHA1);
                } else if (SHA256.equals(type)) {
                    tmp = getSignatureByteString(sig, SHA256);
                }
                mList.add(tmp);
            }
        } catch (Exception e) {
            Log.e("e", e.getMessage());
        }
        mSignMap.put(type, mList);
        return mList;
    }

    /**
     * 获取签名sha1值
     *
     * @param context
     * @return
     */
    public static String getSha1(Context context) {
        String res = "";
        ArrayList<String> mlist = getSignInfo(context, SHA1);
        if (mlist != null && mlist.size() != 0) {
            res = mlist.get(0);
        }
        return res;
    }

    /**
     * 获取签名MD5值
     *
     * @param context
     * @return
     */
    public static String getMD5(Context context) {
        String res = "";
        ArrayList<String> mlist = getSignInfo(context, MD5);
        if (mlist != null && mlist.size() != 0) {
            res = mlist.get(0);
        }
        return res;
    }

    /**
     * 获取签名SHA256值
     *
     * @param context
     * @return
     */
    public static String getSHA256(Context context) {
        String res = "";
        ArrayList<String> mlist = getSignInfo(context, SHA256);
        if (mlist != null && mlist.size() != 0) {
            res = mlist.get(0);
        }
        return res;
    }

    /**
     * 返回对应包的签名信息
     *
     * @param context
     * @param packageName
     * @return
     */
    private static Signature[] getSignatures(Context context, String packageName) {
        PackageInfo packageInfo = null;
        try {
            packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
            return packageInfo.signatures;
        } catch (Exception e) {
            Log.e("e", e.toString());
        }
        return null;
    }

    /**
     * 获取相应的类型的字符串(把签名的byte[]信息转换成16进制)
     *
     * @param sig
     * @param type
     * @return
     */
    private static String getSignatureString(Signature sig, String type) {
        byte[] hexBytes = sig.toByteArray();
        String fingerprint = "error!";
        try {
            MessageDigest digest = MessageDigest.getInstance(type);
            if (digest != null) {
                byte[] digestBytes = digest.digest(hexBytes);
                StringBuilder sb = new StringBuilder();
                for (byte digestByte : digestBytes) {
                    sb.append((Integer.toHexString((digestByte & 0xFF) | 0x100)).substring(1, 3));
                }
                fingerprint = sb.toString();
            }
        } catch (Exception e) {
            Log.e("e", e.toString());

        }

        return fingerprint;
    }

    /**
     * 获取相应的类型的字符串(把签名的byte[]信息转换成 95:F4:D4:FG 这样的字符串形式)
     *
     * @param sig
     * @param type
     * @return
     */
    private static String getSignatureByteString(Signature sig, String type) {
        byte[] hexBytes = sig.toByteArray();
        String fingerprint = "error!";
        try {
            MessageDigest digest = MessageDigest.getInstance(type);
            if (digest != null) {
                byte[] digestBytes = digest.digest(hexBytes);
                StringBuilder sb = new StringBuilder();
                for (byte digestByte : digestBytes) {
                    sb.append(((Integer.toHexString((digestByte & 0xFF) | 0x100)).substring(1, 3)).toUpperCase());
                    sb.append(":");
                }
                fingerprint = sb.substring(0, sb.length() - 1).toString();
            }
        } catch (Exception e) {
            Log.e("e", e.toString());
        }

        return fingerprint;
    }
}




调用上面的 String md5=AppSigning.getMD5(MainActivity.this)就可以了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查看Android打包时签名文件keystore的MD5值 的相关文章

  • 如何在R中创建列的md5哈希值?

    我有一个数据框 ID VID 1 xyz 0001 我想更换VIDmd5 哈希为VID列值 我该如何在 R 中做到这一点 我在看digest包但不知道如何将其放入 R 代码中 Thanks Package digest绝对适合这个任务 所以
  • 无法读取 Android 调试密钥

    尝试构建我的应用程序 10 分钟前我可以毫无问题地构建该应用程序 但突然开始出现此错误 What went wrong Execution failed for task app packageDebug gt Failed to read
  • PHP - MD5、SHA、哈希安全

    我是一个用 PHP 构建的新网站的开发人员 我想知道什么是最好的 用于散列的东西 我已经研究过 md5 和 sha1 但还有更安全的吗 如果这是一个菜鸟问题 我很抱歉 但我是 PHP 安全新手 我正在努力让我的 网站尽可能安全 还有什么是盐
  • Android 证书已过期

    目前 我在签署我的应用程序时收到一条错误消息 指出证书已过期 不是调试证书 我知道这令人惊讶 因为 Android 证书应该可用很多年 我无法创建新证书 因为在 PlayStore 上更新我的 apk 时出现错误 apk 的证书必须与前一个
  • BSD md5 与 GNU md5sum 输出格式?

    任何人都知道为什么 BSD md5 程序会产生这种格式的哈希输出 MD5 checksum md5 9eb7a54d24dbf6a2eb9f7ce7a1853cd0 而 GNU md5sum 会产生像这样更合理的格式 9eb7a54d24d
  • md5(file_contents_as_string) 等于 md5_file(/path/to/file) 吗?

    If I do 这将始终产生与以下内容相同的哈希值 是的 他们返回相同的 var dump md5 file get contents FILE var dump md5 file FILE 在我的例子中返回这个 string 32 4d2
  • Tomcat Digest 与 Manager WebApp

    我正在尝试为 tomcat 管理器应用程序设置摘要密码 我有
  • 任务“:app:signReleaseBundle”执行失败

    我现在有这个错误要犯flutter build appbundle 这是错误 FAILURE Build failed with an exception What went wrong Execution failed for task
  • 生成 MD5 密钥并保存在文本文件中

    我正在使用 MD5 命令行实用程序 可以从此处获取http www fourmilab ch md5 http www fourmilab ch md5 我想要做的就是生成一个文件夹中所有文件的 MD5 密钥并将它们保存在一个文件中 但是
  • 截断 MD5 的 ECDF 图

    在这个link https stackoverflow com questions 8184941 uniform distribution of truncated md5 它表示截断的 MD5 是均匀分布的 我想使用 PySpark 检
  • 我如何编写 Perl 脚本来计算目录中每个文件的 MD5 和? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有办法编写Perl脚本来计算目录中每个文件的MD5sum 如果是这样 我该怎么做 有很多方法可以做到这一点 但归结为您需要执行的两个操
  • java.io.IOException:无效的密钥库格式

    有谁知道如何解决这个问题 我尝试了很多方法 但没有一个有效 当我单击更多详细信息时 我得到以下信息 at sun security provider JavaKeyStore engineLoad Unknown Source atsun
  • 如何将 Java 客户端连接到 Windows 10 上的 Azure Cosmos db 模拟器,找不到证书

    Problem 我的演示代码客户端无法连接到 Windows 10 上的 Azure Cosmos 模拟器 Steps 我在 Windows 上安装了 Cosmosdb 模拟器 看起来不错 根据文档 我启动了 Windows cert ma
  • JKS、BKS 和 PKCS12 文件格式

    我正在设置一个无头服务器 该服务器使用用户提供的数据 JS CSS HTML 密钥库 为 Android 构建 Phonegap 混合应用程序 我想进行一些基本的客户端检查 以确保上传的密钥库有效 对于 JKS 文件 我发现可以通过确保提供
  • MessageDigest MD5 算法未返回我期望的结果

    我脑后的某个东西告诉我 我在这里遗漏了一些明显的东西 我正在将现有的 java 项目与第三方 api 集成 该第三方 api 使用 api 密钥的 md5 哈希进行身份验证 它对我不起作用 在调试过程中我意识到我生成的哈希值与他们提供的示例
  • 使用 md5 加密的 PHP 和 Mysql 查询出现问题

    我使用普通的 php mysql 插入查询并使用 md5 加密密码 这是插入查询 sql mysql query INSERT INTO user username password role approved values usernam
  • 如何通过 md5 比较图像?

    该方法是否比较图像的像素值 我猜它不会起作用 因为它们的尺寸彼此不同 但如果它们相同但格式不同怎么办 例如 我截图并保存为 jpg另一个并保存为 gif MD5哈希是实际的二进制数据 因此不同的格式将具有完全不同的二进制数据 因此 要使 M
  • 如何将 .cer 证书导入 java 密钥库?

    在开发 Java Web 服务客户端期间 我遇到了一个问题 Web 服务的身份验证使用客户端证书 用户名和密码 我从网络服务背后的公司收到的客户端证书位于 cer格式 当我使用文本编辑器检查该文件时 它具有以下内容 BEGIN CERTIF
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • Python:导入 md5 时出错

    我在导入 md5 库时遇到问题 我只是使用下面的代码 import md5 filemd5 md5 new password strip hexdigest 我也尝试过这段代码 from hashlib import md5 filemd5

随机推荐

  • mysql存储过程批量生成脚本

    删除之前的存储过程 DROP PROCEDURE idata 创建 delimiter create procedure idata begin declare i int set i 1 START TRANSACTION while i
  • logback使用

    1 需要引入maven配置 ch qos logback logback classic 1 0 0 这个会依赖slf4j api和logback core ch qos logback logback access 1 1 5 所有的ja
  • OpenVSwitch数据面流表cache机制浅谈

    稍许笔墨写了一篇关于OpenVSwitch 以下简称OVS 的文章 https blog csdn net dog250 article details 103492099 但有些事情并没有说清楚 关于OVS的流表是如何映射成数据平面的Fl
  • MATLAB学习之旅(三)精通VC与Matlab联合编程

    Matlab C C 函数库是Matlab扩展功能重要的组成部分 包含了大量的用C C 语言重新编写的Matlab函数 主要包括初等数学函数 线形代数函数 矩阵操作函数 数值计算函数 特殊数学函数 多项式函数 插值函数等 用户可以在自己的C
  • Python自学教程

    本文目录 什么是Python Python的用途是什么 如何安装Python 为什么选择Python R与Python 学习Python的最佳方法 什么是顶级Python IDE 哪个是最适合Python的IDE 1 什么是Python P
  • python中_、__和__xx__的区别

    0 前言 python灵活的语法 给我们带了一些便利 同时也给我们带了一些困惑 其中就是我们常见的 和 xx 的作用和区别 这节我们就来看一下 1 理论 Python中不存在真正的私有方法 为了实现类似于c 中私有方法 可以在类的方法或属性
  • C++ 编程规范-不能被拷贝构造和拷贝赋值的类对象

    不能被拷贝构造和拷贝赋值的类对象 A aobj1 A aobj2 aobj1 拷贝构造 产生新的对象 A aobj3 aobj3 aobj2 赋值构造 不产生新的对象 如果想不能被拷贝构造 且 不能被拷贝赋值 采用delete class
  • 顺序式线性表(c语言)

    include
  • matlab模拟超声波信号_【超声波测距 教程连载】第三章 Matlab波形采集

    本帖最后由 linccfzu 于 2020 7 15 00 08 编辑 大家晚上好 这一章主要介绍一下超声波波形数据的采集 并且上传到Matlab进行信号处理 由于我们现在用的是40k的超声波频率 用stm32 ADC采样完全够了 所以这里
  • Pycham无法创建py文件的问题

    刚下载这个软件 什么都不懂就遇到了这个问题 在网上搜解决问题的办法 发现遇到这样问题的人并不多 而且遇到这个问题的原因也不一样 没办法 只能找学长问问 经过一个小时的摸索 卸载重装也没办法 最后的最后 学长发现 我的账户不是管理员身份 然后
  • 堆叠注入--攻防世界CTF赛题学习

    在一次联系CTF赛题中才了解到堆叠注入 在这里简单介绍一下 堆叠注入的原理什么的一搜一大堆 我就不引用百度了 直接进入正题 这个是攻防世界的一道CTF赛题 采用寻常思路来寻找sql注入漏洞 payload 1 and 1 1 利用paylo
  • 汽配企业为什么需要MES管理系统解决方案

    众所周知 汽配组装是汽车制造的关键环节 而汽配行业变革以精益为终极目标 制造业要想脱颖而出 就需要采用MES生产管理系统 以实现制造 物流 质量的精益化管理 在快速的流水线节拍生产下 汽配MES管理系统不仅提高了产品的质量 降低了生产成本
  • Java入门——编程案例(1)

    案例01 买飞机票 机票价格按照淡季旺季 头等舱和经济舱收费 输入机票原价 月份和头等舱或者经济舱 机票最终优惠价格的计算方案如下 旺季 5 10月 头等舱9折 经济舱8 5折 淡季 11月到来年4月 头等舱7折 经济舱6 5折 impor
  • 4. 文件系统 (FILE SYSTEM)

    所有的应用都需要存储和检索信息 当进程运行时 它可以存储有限数量的信息到自己的地址空间中 然而 其存储能力受限于虚拟地址空间的大小 对一些应用来说 虚拟地址空间并不能满足其存储需求 将信息保存在进程的地址空间的第二个问题是 当进程结束时信息
  • 科技之光-激光器知识普及

    前几天在一处看到比较好的文章记录一下
  • 建立完善的区块链游戏新生态——HTML5区块链游戏大会在京举行

    5月19日 由白鹭科技和Egretia共同主办的 2018 HTML5区块链游戏大会 HBGS 在京隆重举办 大会首次向全球发布了HTML5区块链游戏完整开发工作流 并举办HTML5区块链游戏行业联盟成立仪式 来自海内外互联网科技创新企业创
  • python缩进说法_每天一道Python选择题--python缩进

    一 开胃菜 以下代码是否正确 age 3 if age lt 6 print 不能上小学 else print 可以 A 正确 B 错误 答案 B else 语句下的 print 可以 没有缩进 程序运行报错 选B 错误 历年是个二级考点
  • c++指针之间类型转换的坑

    c 指针之间类型转换的坑 c中指针类型的转换 c 中指针类型的转换 c中指针类型的转换 C风格可以把不同类型的指针进行转换 c 中指针类型的转换 C风格可以把不同类型的指针进行转换 C 不可以 需要借助void 使用空指针 然后将空指针转换
  • Linux高阶命令:编译和反编译

    一 编译和反编译 1 编译单个C语言源文件 命令格式 gcc 文件名 c o 输出文件名 命令解释 使用gcc编译器编译源文件 并指定生成的可执行文件名 例子 在Ubuntu下 先建立并编辑一个简单的C语言程序 nano test c 使用
  • 查看Android打包时签名文件keystore的MD5值

    有些SDK提供方需要我们提供打包APK时使用的包名和签名文件 xxxxxx jks这个文件 MD5值 然后SDK服务端应该会进行比对保证商户调用的合法性 不然光靠包名是可以伪造的 怎么获取签名文件的MD5值 方法一 原先通过命令keytoo