是谷歌和华为的哈希码SMS检索API计算相同的方式?



我们有一个android应用程序与短信登录功能。当用户收到格式为"您的验证码:1234 kla37su2so0g "的短信时,则代码为";1234"自动插入到代码提示字段中。

对于android设备与谷歌服务,我们使用谷歌的短信检索API。对于华为设备(不支持google服务),我们使用华为短信检索API。

主要问题是,当我们试图为发布版本计算google和huawei SMS retrierver api的哈希码时,我们得到了不同的哈希码(在上面的示例中:"KLa37su2s0g")。

所以问题是:这些短信哈希码应该是相同的还是不同的谷歌和华为?

Google提供的短信哈希码与华为提供的短信哈希码不一致是没有问题的

短信中的hash_value字段由HMS Core SDK生成,用于唯一标识当前应用。华为哈希码由HMS Core SDK生成。

Google SMS Hashcode: https://developers.google.com/identity/sms-retriever/verify#computing_your_apps_hash_string

  1. 将用于签署应用程序的证书转换为小写十六进制字符串
  2. 将十六进制字符串附加到应用程序包名后,用
  3. 计算组合字符串和的SHA-256将结果转换为Base64字符串
  4. 字符串的前11个字符Base64字符串是SMS
  5. 中使用的散列。

对于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;
}
}

最新更新