1

我们有一个带有短信登录功能的安卓应用。当用户收到格式为例如“Your auth code: 1234 KLa37su2s0g”的短信时,代码“1234”会自动插入到代码提示字段中。

对于带有谷歌服务的安卓设备,我们使用谷歌的 SMS Retriever API。对于华为设备(不支持谷歌服务),我们使用华为 SMS Retriever API。

主要问题是,在尝试计算发布版本的哈希码时,我们会为谷歌和华为 SMS Retriever API 获得不同的哈希码(在上面的示例中:“KLa37su2s0g”)。

那么问题来了:对于谷歌和华为来说,这些短信哈希码应该相同还是不同?

4

2 回答 2

0

对于谷歌短信哈希码:https ://developers.google.com/identity/sms-retriever/verify#computing_your_apps_hash_string

  1. 将用于签署应用程序的证书转换为小写十六进制字符串
  2. 将该十六进制字符串附加到应用程序包名称中,以单个空格分隔
  3. 计算组合字符串的 SHA-256 并将结果转换为 Base64 字符串
  4. Base64 字符串的前 11 个字符是 SMS 中使用的哈希值

对于 HMS SMS 哈希码:您可以通过实现以下类来获取您的哈希值:

public class hashcodeHMS extends ContextWrapper {
    public static final String TAG = hashcodeHMS.class.getSimpleName();
 
    public hashcodeHMS(Context context) {
        super(context);
    }
 
    public MessageDigest getMessageDigest() {
        MessageDigest messageDigest = null;
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
        } catch (NoSuchAlgorithmException e) {
            Log.e(TAG, "No Such Algorithm.", e);
        }
        return messageDigest;
    }
 
    public String getSignature(Context context, String packageName) {
        PackageManager packageManager = context.getPackageManager();
        Signature[] signatureArrs;
        try {
            signatureArrs = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures;
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "Package name inexistent.");
            return "";
        }
        if (null == signatureArrs || 0 == signatureArrs.length) {
            Log.e(TAG, "signature is null.");
            return "";
        }
        Log.e("hashhms =>", signatureArrs[0].toCharsString());
        return signatureArrs[0].toCharsString();
    }
 
    public String getHashCode(String packageName, MessageDigest messageDigest, String signature) {
        String appInfo = packageName + " " + signature;
        messageDigest.update(appInfo.getBytes(StandardCharsets.UTF_8));
        byte[] hashSignature = messageDigest.digest();
        hashSignature = Arrays.copyOfRange(hashSignature, 0, 9);
        String base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING | Base64.NO_WRAP);
        base64Hash = base64Hash.substring(0, 11);
        return base64Hash;
    }
}
于 2021-08-11T16:38:35.847 回答
0

谷歌和华为提供的短信哈希码的差异是没有问题的。

SMS 消息中的hash_value字段由 HMS Core SDK 生成,用于唯一标识当前应用程序。华为哈希码由 HMS Core SDK 生成。

于 2021-08-11T02:15:04.003 回答