Итак, я работаю над проверкой подписки на Facebook с помощью Java. К сожалению, я все время сталкиваюсь с проблемами с процессом проверки. Я посмотрел на this documentation и эмулировал их алгоритм, без успеха. Я также следовал this tutorial и продолжал придумывать, что моя рассчитанная подпись отличается от той, которую отправил Facebook.HMAC SHA-256 и Facebook signed_request
По крайней мере, это то, о чем мне рассказывал String.equals().
Так что я решил еще раз подсунуть ему.
Я установил его для повторения по байтам в моей рассчитанной сигнатуре и предоставленных. Низкий и вот, первые 32 байта моей подписи соответствовали их точно. Он просто пропускал еще 400 байтов данных.
В этот момент я решил, что, вероятно, должен получить лучшее представление о том, что происходит. Я посмотрел на SHA-256 и нашел, что действительно, it only creates 32 bytes of information. Итак, у меня осталось более 400 байт данных, которые, по мнению Facebook, были сгенерированы с использованием алгоритма HMAC SHA-256. Я думал, что мне нужно сравнить максимальную длину SHA-256 с длиной данных, которые я хеширую, но это только что показало, что есть способ, путь, путь к большому количеству места (размер сообщения: 575 байт, максимальный размер : 2.305843009213694 x 10^18 байт).
Является ли Facebook создание дерьма? Или я чего-то не хватает?
редактировать
Это функция я использую хэш данных. Я передаю свой секретный код facebook (для ключа) и объект JSON, закодированный base64url (для данных). Он последовательно возвращает массив байтов длиной 32 с данными, которые соответствуют первым 32 байтам подписи, предоставленной facebook.
private byte[] hmacSHA256(String data, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKey);
mac.update(data.getBytes("UTF-8"));
byte[] hmacData = mac.doFinal();
return hmacData;
}
Спасибо!Мне действительно удалось выяснить, что не так с моей (я идиот, и не назначал значение строки, в которой выполнял операцию). Я дам вам ответ, поскольку вы предоставили код. – Chaosphere2112
Спасибо, сэр. Функция hmacSHA256 не вернула мне правильное значение, затем я объединил ваш ответ с [другим, найденным в SO] (https://stackoverflow.com/questions/3103652/hash-string-via-sha-256-in -java) и придумал этот оператор return: 'return String.format («% 064x », новый java.math.BigInteger (1, hmacData));' – Seza