美文网首页Android开发Android开发Android技术知识
Android 关于加入Google签名计划(分配的签名文件)G

Android 关于加入Google签名计划(分配的签名文件)G

作者: Silence潇湘夜雨 | 来源:发表于2020-01-20 12:08 被阅读0次

前提:

最近总是看到有人在问发布应用到Google Play之后,签名改变了,然后导致登录不成功的问题。之前没怎么在意,但是,问的人多了之后就想着,既然问的人这么多,那么直接写一篇文章来统一说明一下解决方式。

首先

之前加入到Google签名计划是一个可选项,但是,最近发布的应用好像默认就会分配一个新的签名。这就给我们测试增加了难度,需要使用Google新分配的签名文件的SHA1来重新配置登录需要的文件。这里的登录不仅指的是Google登录还有Facebook登录,因为签名变了之后SHA1也会改变。所以,Google需要更新Android版的AuthID的SHA1,Face book需要更新新的散列密钥

说了那么多,来看看自己的签名和Google分配的签名

Google签名.png

如上图所示,可以看到Google分配的签名,这里面会生成新的SHA1MD5SHA-256,那么我们所需要的是什么呢,做过google登录的都知道需要SHA1,那么问题来了。需要用新的SHA1还是自己原来的SHA1呢?当然是要用Google分配的SHA1了。因为我们需要在Google Play上面发布应用。

其次

上面说了那么多的原因,那么下面来看解决办法。

  • 关于Google登录的配置,可以看这篇Google登录配置,如果配置过了,那么看一下如何修改,我们只需要修改Android版的AuthID,并且修改里面对应的SHA1

    加入Google签名后修改SHA1的地方.png
    注意:SHA1这里需要更换成Google分配的签名的SHA1其他的保持不变。
  • 也有同仁遇到过Facebook登录失败的问题,说的是散列密钥错误。那么,我们的散列密钥是怎么生成的呢?

    keytool -exportcert -alias (签名的别名) -keystore (签名文件路径) | openssl sha1 -binary | openssl base64
    

上面的就是我们生成散列密钥的方法,需要签名的别名和路径,当然还要有密钥。当我们有签名的时候当然会很容易的生成,那么Google分配的签名呢?我们怎么知道别名?怎么知道路径?怎么知道密钥?别担心,这里给你解决方法。

  • 1、这里我根据当前网址的JS源码的算法,自己写出了一套JAVAkotlin源码,当前网址是如下图所示的用法
    根据SHA1生成散列密钥.png

如上图所示,我们只需要填入Google分配给我们的新的SHA1即可生成散列密钥然后填入到Facebook的后台配置中。

  • 2、代码中的用法是如何的呢?且看下面的源码

java版的

   /**
    * 转换工具类
    */
   public class ConvertUtil {

   /**
    * 输入内容
    *
    * @param input   输入的内容
    * @param isCheck 是否取消选择OX
    * @return 返回取消OX后的值
    */
  private static String input(String input, boolean isCheck) {
    input = input.toUpperCase();
    if (isCheck) {
        Pattern pattern = Pattern.compile("0X");
        Matcher matcher = pattern.matcher(input);
        input = matcher.replaceAll("");
    }
    Pattern pattern = Pattern.compile("[^A-Fa-f0-9]");
    Matcher matcher = pattern.matcher(input);
    input = matcher.replaceAll("");
    return input;
  }

   /**
    * 转换
    *
    * @param input   输入的内容
    * @param isCheck 是否取消选择OX
    * @return 返回散列密钥
    */
  public static String convert(String input, boolean isCheck) {
    String array;
    String result = input(input, isCheck);
    if (result.length() % 2 != 0) {
        return "123";
    }
    int[] mArray = new int[result.length() / 2];
    for (int index = 0; index < result.length() / 2; index++) {
        String h = result.substring(index * 2, index * 2 + 2);
        Log.e("TA", h + "");
        mArray[index] = Integer.parseInt(h, 16);
    }
    array = convertTo64(mArray);
    return array;
  }

  /**
   * 转换为64为的String字符串
   *
   * @param input int 数组
   * @return 转换后的散列密钥
   */
  private static String convertTo64(int[] input) {
    String base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    String ret = "";
    int i = 0;
    int j = 0;
    int[] char_array_3 = new int[3];
    int[] char_array_4 = new int[4];
    int in_len = input.length;
    int pos = 0;

    while (in_len-- != 0) {
        char_array_3[i++] = input[pos++];
        if (i == 3) {
            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
            char_array_4[3] = char_array_3[2] & 0x3f;

            for (i = 0; (i < 4); i++)
                ret += base64_chars.charAt(char_array_4[i]);
            i = 0;
        }
    }

    if (i != 0) {
        for (j = i; j < 3; j++)
            char_array_3[j] = 0;

        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3f;

        for (j = 0; (j < i + 1); j++)
            ret += base64_chars.charAt(char_array_4[j]);

        while ((i++ < 3))
            ret += '=';

    }
    return ret;
   }


  }

kotlin版的如下

 /**
  * 转换工具类
  */
 object ConvertUtil {

/**
 * 转换
 *
 * @param input   输入的内容
 * @param isCheck 是否取消选择OX
 * @return 返回散列密钥
 */
fun convert(input: String, isCheck: Boolean): String {
    val array: String
    val result = input(input, isCheck)
    if (result.length % 2 != 0) {
        return "123"
    }
    val mArray = IntArray(result.length / 2)
    for (index in 0 until result.length / 2) {
        val h = result.substring(index * 2, index * 2 + 2)
        mArray[index] = h.toInt(16)
    }
    array = convertTo64(mArray)
    return array
}

/**
 * 输入内容
 *
 * @param input   输入的内容
 * @param isCheck 是否取消选择OX
 * @return 返回取消OX后的值
 */
private fun input(input: String, isCheck: Boolean): String {
    var input = input
    input = input.toUpperCase()
    if (isCheck) {
        val pattern = Pattern.compile("0X")
        val matcher = pattern.matcher(input)
        input = matcher.replaceAll("")
    }
    val pattern = Pattern.compile("[^A-Fa-f0-9]")
    val matcher = pattern.matcher(input)
    input = matcher.replaceAll("")
    return input
}


/**
 * 转换为64为的String字符串
 *
 * @param input int 数组
 * @return 转换后的散列密钥
 */
private fun convertTo64(input: IntArray): String {
    val base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    var ret = ""
    var i = 0
    var j = 0
    val char_array_3 = IntArray(3)
    val char_array_4 = IntArray(4)
    var in_len = input.size
    var pos = 0
    while (in_len-- != 0) {
        char_array_3[i++] = input[pos++]
        if (i == 3) {
            char_array_4[0] = char_array_3[0] and 0xfc shr 2
            char_array_4[1] =
                (char_array_3[0] and 0x03 shl 4) + (char_array_3[1] and 0xf0 shr 4)
            char_array_4[2] =
                (char_array_3[1] and 0x0f shl 2) + (char_array_3[2] and 0xc0 shr 6)
            char_array_4[3] = char_array_3[2] and 0x3f
            i = 0
            while (i < 4) {
                ret += base64_chars[char_array_4[i]]
                i++
            }
            i = 0
        }
    }
    if (i != 0) {
        j = i
        while (j < 3) {
            char_array_3[j] = 0
            j++
        }
        char_array_4[0] = char_array_3[0] and 0xfc shr 2
        char_array_4[1] = (char_array_3[0] and 0x03 shl 4) + (char_array_3[1] and 0xf0 shr 4)
        char_array_4[2] = (char_array_3[1] and 0x0f shl 2) + (char_array_3[2] and 0xc0 shr 6)
        char_array_4[3] = char_array_3[2] and 0x3f
        j = 0
        while (j < i + 1) {
            ret += base64_chars[char_array_4[j]]
            j++
        }
        while (i++ < 3) ret += '='
    }
    return ret
}
}
  • 3、关于Facebook如何配置,如果不太明白的话可以看看这篇:Facebook 配置,关于如何配置散列密钥?可以看下图 加入google签名计划后的散列密钥.png
    如上图所示这里的散列密钥换成刚生成的即可。

最后

好了,到此我们今天的文章就结束了。关于如何解决Google和Facebook加入签名计划后不能成功登录的问题就到此结束了。如果还有其他问题可以加群探讨,群号是:493180098

相关文章

网友评论

    本文标题:Android 关于加入Google签名计划(分配的签名文件)G

    本文链接:https://www.haomeiwen.com/subject/rykjzctx.html