些SDK提供方需要我們提供打包APK時(shí)使用的包名和簽名文件(xxxxxx.jks這個(gè)文件)MD5值,然后SDK服務(wù)端應(yīng)該會進(jìn)行比對保證商戶調(diào)用的合法性。不然光靠包名是可以偽造的,怎么獲取簽名文件的MD5值?
方法一:
原先通過命令keytool -list -v -keystore test.jks 可以查看md5值,但是發(fā)現(xiàn)現(xiàn)在查看不了,只有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')
? ? }
}
}
右側(cè)gradle Tasks里面雙擊signingReport就可以查看簽名文件的MD5值了
?
?
獲取后去掉 :
方法三:從PackageInfo類中獲取文章來源:http://www.zghlxwxcb.cn/news/detail-706127.html
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<>();
/**
* 返回一個(gè)簽名的對應(yīng)類型的字符串
*
* @param context
* @param type
* @return 因?yàn)橐粋€(gè)安裝包可以被多個(gè)簽名文件簽名,所以返回一個(gè)簽名信息的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;
}
/**
* 返回對應(yīng)包的簽名信息
*
* @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;
}
/**
* 獲取相應(yīng)的類型的字符串(把簽名的byte[]信息轉(zhuǎn)換成16進(jìn)制)
*
* @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;
}
/**
* 獲取相應(yīng)的類型的字符串(把簽名的byte[]信息轉(zhuǎn)換成 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;
}
}
?調(diào)用上面的 String md5=AppSigning.getMD5(MainActivity.this)就可以了文章來源地址http://www.zghlxwxcb.cn/news/detail-706127.html
到了這里,關(guān)于Android打包時(shí)簽名文件keystore的MD5值的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!