【问题标题】:How does google verify Android SHA1 fingerprints and packages?google如何验证Android SHA1指纹和包?
【发布时间】:2015-10-13 20:57:59
【问题描述】:

我正在尝试使我的 Google 翻译 API 工作,但目前我找不到方法。这就是我在 Google Developer Console 中设置的方式:
我已经使用调试证书设置了我的 SHA1 指纹。和包名-“bg.webmap.wordy”(这是实际名称)。当我尝试拨打电话时,JSON 中会返回“ipRefererBlocked”错误。但是当我删除指纹和包名时,它可以正常工作,但是每个人都可以使用这个密钥,所以非常不安全。所以我的问题是身份验证。
调用 API 时,我的应用会自动发送此指纹吗?我应该自己发送吗?如何发送?问题可能出在调试证书中吗?

【问题讨论】:

  • @BabbevDan 找到问题的答案了吗?
  • 不,我以不安全的方式结束了它

标签: android google-api google-translate


【解决方案1】:

当 API 启用时,我的应用会自动发送此指纹吗? 叫什么?

不!

我应该自己发送吗?如何发送?

是的!

在为 Android 应用设置 API 密钥限制时,您指定了包名称和 SHA-1 证书指纹。因此,当您向 Google 发送请求时,您必须在每个请求的标头中添加这些信息。

怎么做?

As answered here,你需要从你的代码中获取你的包名和SHA证书,然后添加到请求头中。

获取 SHA 证书:

/**
 * Gets the SHA1 signature, hex encoded for inclusion with Google Cloud Platform API requests
 *
 * @param packageName Identifies the APK whose signature should be extracted.
 * @return a lowercase, hex-encoded
 */
public static String getSignature(@NonNull PackageManager pm, @NonNull String packageName) {
    try {
        PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
        if (packageInfo == null
                || packageInfo.signatures == null
                || packageInfo.signatures.length == 0
                || packageInfo.signatures[0] == null) {
            return null;
        }
        return signatureDigest(packageInfo.signatures[0]);
    } catch (PackageManager.NameNotFoundException e) {
        return null;
    }
}

private static String signatureDigest(Signature sig) {
    byte[] signature = sig.toByteArray();
    try {
        MessageDigest md = MessageDigest.getInstance("SHA1");
        byte[] digest = md.digest(signature);
        return BaseEncoding.base16().lowerCase().encode(digest);
    } catch (NoSuchAlgorithmException e) {
        return null;
    }
}

添加到请求头:

java.net.URL url = new URL(REQUEST_URL);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
try {
    connection.setDoInput(true);
    connection.setDoOutput(true);

    connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
    connection.setRequestProperty("Accept", "application/json");

    // add package name to request header
    String packageName = mActivity.getPackageName();
    connection.setRequestProperty("X-Android-Package", packageName);
    // add SHA certificate to request header
    String sig = getSignature(mActivity.getPackageManager(), packageName);
    connection.setRequestProperty("X-Android-Cert", sig);
    connection.setRequestMethod("POST");

    // ADD YOUR REQUEST BODY HERE
    // ....................
} catch (Exception e) {
    e.printStackTrace();
} finally {
    connection.disconnect();
}

你可以看到完整的答案here

享受编码:)

【讨论】:

  • 那么 google 如何从 Google Place API、Maps 等获取 X-Android-Cert?
猜你喜欢
  • 2021-10-27
  • 2013-12-03
  • 2015-07-16
  • 2015-12-17
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
相关资源
最近更新 更多