有些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)就可以了

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

  1. 查看 android打包证书签名

    查看 android打包证书签名 用java keytool 查看证书签名 keytool -list -v -keystore 证书路径 输入证书密码之后会看到 MD5\SHA1\SHA256 签名 ...

  2. android生成md5,使用Android studio生成签名文件以及获取MD5

    内容要点:android 一.Android studio生成签名文件安全 二.经过Android studio获取MD5app 1.Android studio生成签名文件ide 在菜单栏中,点击 ...

  3. android ndk 编译虚幻4,[UE4]Android 打包步骤与keystore生成设置

    官方文档步骤: https://docs.unrealengine.com/latest/INT/Platforms/Android/GettingStarted/index.html 注:这里演示使 ...

  4. android签名忘记密码,Android打包时忘记了签名文件的密码

    今天发生一件十分坑爹的事,之前维护的一个项目急需发布新版本,但是我竟然忘记了签名文件的密码,别名,别名密码全都忘了,尝试了好几次都不行,于是各种查资料,好在最后找到了解决方案,现记录下来以备不时之需. ...

  5. android打包时出现***is not translated in zh-rCN (Chinese: China)

    现象描述: Android项目,使用eclipse打apk包时,报错: strings.xml等资源文件***is not translated in "zh-rCN" (Chin ...

  6. UE4安卓打包配置(大陆内网络整顿后,Android打包时AndroidWorks无法使用的解决方法)

    由于国内进行了网络整顿,UE4官网上用CodeWorksforAndroid下载安卓打包工具配置的方法已经不能使用了,开了VPN也链接不上.这使得用UE4打包配置安卓游戏变得非常麻烦,博主捣鼓了好几天 ...

  7. Android 打包报 Invalid keystore format

    Invalid keystore format   出现这个错误,我这里是jdk配置出现了问题,一个是自己下载安装的jdk ,一个是android studio安装带的jre,改成 android s ...

  8. [UE4]android打包时,设备上弹出错误:Failed to open descriptor file uproject

    UE4以shipping模式在android设备上Launcher时,游戏启动时会提示错误: Failed to open descriptor file uproject 网上查了下,UE官方论坛上 ...

  9. 基于vue框架下使用Element-UI获取文件MD5值并上传

    基于vue框架下使用Element-UI获取文件MD5值并上传 使用插件: spark-md5 .vue页面 <el-uploadclass="avatar-uploader idca ...

  10. android studio生产签名文件,Android Studio生成keystore签名文件步骤讲解

    Android App打包时要用到签名文件,Android Studio生成签名文件步骤如下: Build---Generate Signed Apk...如图: 如果你的project中有2个或者2 ...

最新文章

  1. Linux服务器安装python3.6.1 运行爬虫
  2. Sci-Hub重生了,这回用上了分布式网络
  3. 统计5分钟内Nginx访问量及平均相应时间
  4. 汇编:OF溢出标志位
  5. VM与VPC共存(续)
  6. shell 中引用参数总结
  7. GraphQL支持层级结构的query
  8. linux db2 ssl,IBM DB2 Content Manager V83与手工配置SSL
  9. java安全——加密
  10. 应对不良网络文化的技术之一——网络信息抽取技术
  11. excel批量更改超链接_批量新建Excel指定名称工作表并设置超链接!你,学会了吗?...
  12. linux-gzip压缩
  13. Asp.Net MVC 的重要入门概念
  14. 睡眠监测中的一些术语和指标(AASM)
  15. Smobiler实现手机弹窗
  16. 【ESP8266+STM32】获取B站粉丝数,并在STM32屏上显示出来(物联网小项目)
  17. 航空公司客户价值特征构建与分析k-means
  18. 计算机中职生毕业鉴定评语,中职生学生毕业鉴定评语
  19. jdk1.8换成11,启动项目报错java.net.MalformedURLException: unknown protocol: jrt
  20. 详解1M宽带下载速度?1M等于多少kb?

热门文章

  1. 【2021】重装ubuntu16.04系统
  2. 百度文库免费下载(附:分享一些有趣的网站,最后一个可以免飞下载百度文库)
  3. 【路径规划】基于蚁群算法求解带时间窗车辆路径问题(VRPTW)matlab代码
  4. 一款,整合百度翻译api跟有道翻译api的翻译君
  5. 高德城市编码json_sql_excel 三级联动json合集
  6. html星星连线特效代码,js实现飞入星星特效代码
  7. 安卓系统加速_安卓系统用户玩LOL手游用网易UU加速器加速被拦截解决方案
  8. MATLAB计算图片的标准差与方差 MEAN STD
  9. python删除word表格中的某一行_python-docx添加和删除表格行、列
  10. Cadence PSpice 仿真6:反向放大器傅里叶仿真(FFT,谐波分析)实战图文教程