12

我正在尝试模拟 google+ 按钮。在LINK的某些代码中,它将会话 ID 转换为某种哈希。我发现会话 ID 名称是 SAPISID,转换后的哈希名称是 SAPISIDHASH,谁能告诉我代码的哪一部分做哈希部分。任何帮助将不胜感激。我已经连续花了 6 个小时,仍然没有任何线索:(

例如VUOyLIU22fNPz2ko/AbGsxW03_WHoGjaJq is SAPISIDf17aa630b9b9a105dad437b0fedcafe429f6fca2 is SAPISIDHASH。在 php 中,我尝试了所有类型的 hash..nothing 匹配。

4

2 回答 2

39

胜利!至少对我来说很好。SAPISIDHASH我正在寻找的是 API 控制台中的那个。相当大的工作自动化,完全合法。我发现的一个是当前 JavaScript 毫秒时间戳上的 SHA1,加上你SAPISID的 cookie 中的当前时间加上域来源。为了使我的请求生效,我必须在请求中包含以下标头:

Authorization:SAPISIDHASH 1439879298823_<hidden sha1 hash value>

和:

X-Origin:https://console.developers.google.com

我假设的第一个标头告诉服务器您的时间戳和您的 SHA1 值。第二个(如果你不包括它就中断)告诉它在 SHA1 算法中使用的来源。我通过挖掘和调试大量缩小的 JS 找到了该算法。注意在值之间附加了空格。伪代码基本上是:

sha1(new Date().getTime() + ' ' + SAPISID + ' ' + origin);

至少这就是我SAPISIDHASH在 2015 年(几年后我知道)在这里的用例中获得价值的方式......与你的不同,但也许有一天我会帮助其他一些年轻的优秀黑客。

于 2015-08-18T06:43:11.800 回答
7

所有学分都归功于戴夫·托马斯。

我只是想澄清一下,对于 X-Origin 或 Origin,您不包括“X-Origin:”或“Origin:”

这是一个例子:

public class SAPISIDHASH {

    public static void main(String [] args) {

        String sapisid = "b4qUZKO4943exo9W/AmP2OAZLWGDwTsuh1";
        String origin = "https://hangouts.google.com";
        String sapisidhash = "1447033700279" + " " + sapisid + " " + origin;
        System.out.println("SAPISID:\n"+ hashString(sapisidhash));
        System.out.println("Expecting:");
        System.out.println("38cb670a2eaa2aca37edf07293150865121275cd");

    }

    private static String hashString(String password)
    {
        String sha1 = "";
        try
        {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(password.getBytes("UTF-8"));
            sha1 = byteToHex(crypt.digest());
        }
        catch(NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch(UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        return sha1;
    }

    private static String byteToHex(final byte[] hash)
    {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
}

Java 中 sha1 的源代码: Java 字符串到 SHA1

于 2015-11-09T02:30:04.123 回答