我正在尝试模拟google+按钮。在LINK的部分代码中,它将会话ID转换为某种哈希值。我发现会话ID名称是SAPISID,转换后的哈希名称是SAPISIDHASH,谁能告诉我哪个部分代码执行哈希部分。任何帮助将不胜感激。我已经连续 6 个小时了,仍然没有任何线索:(
例如
VUOyLIU22fNPz2ko/AbGsxW03_WHoGjaJq is SAPISID
和 f17aa630b9b9a105dad437b0fedcafe429f6fca2 is SAPISIDHASH
。在 php 中我尝试了所有类型的哈希..没有匹配。
胜利!至少对我来说很好。我正在寻找的
SAPISIDHASH
是
API 控制台中的一个。相当大的工作的自动化,完全合法。
我发现的是当前 JavaScript 毫秒时间戳的 SHA1
加上 cookie 中当前的 SAPISID
以及域来源。为了
为了使我的请求有效,我必须在请求中包含以下标头:
Authorization:SAPISIDHASH 1439879298823_<hidden sha1 hash value>
和:
X-Origin:https://console.developers.google.com
我假设第一个标头告诉服务器您的时间戳和 SHA1 值。 第二个(如果不包含它就会中断)告诉它在 SHA1 算法。我通过深入挖掘和调试找到了算法 大量缩小的 JS 注意,之间附加了空格 价值观。伪代码基本上是:
sha1(new Date().getTime() + ' ' + SAPISID + ' ' + origin);
这至少是我在 2015 年的用例中获得
SAPISIDHASH
值的方式
(几年后我知道)...与你的不同,但也许我会帮助一些
有一天,还有其他年轻的优秀黑客。
所有功劳均归功于戴夫·托马斯。
我只是想澄清一下,对于 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
这适用于 2024 年的 youtube(带有 Deno 运行时的 js)
const now = new Date();
const origin = "https://studio.youtube.com";
const timems = now.getTime() + (now.getTimezoneOffset() * 60 * 1000)
const timesec = Math.round(timems / 1000);
const SAPISID = cookieArray['SAPISID']; // you should know how to get it
const newHash = timesec + '_' + sha1(timesec + ' ' + SAPISID + ' ' + origin, "utf8", "hex"); // this sha1 function is from deno package but you can use any other from the samples above
SAPISIDHASH = newHash; // 1704658177_78eb913fea82472cd726b118c51a6071f9d794f3
我使用 deno 中的 sha1,但您可以使用上面示例中的 sha1 的任何其他实现。