在API控制台中注册Android应用以进行Google API访问时,您必须输入应用SHA1证书指纹和应用的包名称。
现在我想知道当api调用只是简单的HTTP请求时,Google如何验证这些值是否正确(在最简单的情况下,当您不使用他们的API客户端时,可能会附加一些标头值)?您在进行API调用时必须提供API密钥,但这并不能证明输入的值是正确的。
答案 0 :(得分:8)
您可以非常轻松地获取软件包名称以及已安装应用程序的sha 1指纹。
private void printSha1() {
List<ApplicationInfo> mAppList = getPackageManager().getInstalledApplications(0);
for (ApplicationInfo info :mAppList) {
Log.d(TAG, "Package Name: " + info.packageName);
Log.d(TAG, "Sha1: " + getCertificateSHA1Fingerprint(info.packageName));
}
}
private String getCertificateSHA1Fingerprint(String packageName) {
PackageManager pm = getPackageManager();
int flags = PackageManager.GET_SIGNATURES;
PackageInfo packageInfo = null;
try {
packageInfo = pm.getPackageInfo(packageName, flags);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Signature[] signatures = packageInfo.signatures;
byte[] cert = signatures[0].toByteArray();
InputStream input = new ByteArrayInputStream(cert);
CertificateFactory cf = null;
try {
cf = CertificateFactory.getInstance("X509");
} catch (CertificateException e) {
e.printStackTrace();
}
X509Certificate c = null;
try {
c = (X509Certificate) cf.generateCertificate(input);
} catch (CertificateException e) {
e.printStackTrace();
}
String hexString = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(c.getEncoded());
hexString = byte2HexFormatted(publicKey);
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (CertificateEncodingException e) {
e.printStackTrace();
}
return hexString;
}
public static String byte2HexFormatted(byte[] arr) {
StringBuilder str = new StringBuilder(arr.length * 2);
for (int i = 0; i < arr.length; i++) {
String h = Integer.toHexString(arr[i]);
int l = h.length();
if (l == 1) h = "0" + h;
if (l > 2) h = h.substring(l - 2, l);
str.append(h.toUpperCase());
if (i < (arr.length - 1)) str.append(':');
}
return str.toString();
}
如果您运行此代码,它将打印包名称及其sha 1打印。这些是您在创建API密钥时提供的两件事,因此Google会根据它生成的密钥映射这两件事。
您可以看到它可以访问包名称及其SHA 1打印,其他剩余的东西是您通过代码或通过xml(Manifest,提供给必要的库或其他应用程序(Google Play服务)的API密钥。单独的xml配置文件)。
因此,只要Google为您提供任何服务,就可以检查从API控制台生成密钥时生成的相关映射。
包名称的代码取自here