@PigData

Telegram webapps — как проверить hash из Telegram.WebApp.initData на php?

Не получается проверить hash, возможно из-за вложенного массива user

https://core.telegram.org/bots/webapps#validating-...

Для проверки hash при авторизации через виджет мой php код работает

function check_hash($token){
		$arr = $_GET;
		$check_hash = $arr['hash'];
		unset($arr['hash']);
		foreach($arr as $k => $v) $check_arr[]=$k.'='.$v; 
		@sort($check_arr);

		$string = @implode("\n", $check_arr);
		$secret_key = hash('sha256', $token, true);
		$hash = hash_hmac('sha256', $string, $secret_key);
		if (strcmp($hash, $check_hash) !== 0)  return false;
		return true;
	}
  • Вопрос задан
  • 1917 просмотров
Пригласить эксперта
Ответы на вопрос 2
@zhan0
попробуй вот так:
function check_hash($token){
    $arr = $_GET;
    $check_hash = $arr['hash'];
    unset($arr['hash']);
    $data_check_arr = explode('&', rawurldecode($check_hash));
    $needle = 'hash=';
    $check_hash = FALSE;
    foreach( $data_check_arr AS &$val ){
        if( substr( $val, 0, strlen($needle) ) === $needle ){
            $check_hash = substr_replace( $val, '', 0, strlen($needle) );
            $val = NULL;
        }
    }

    $data_check_arr = array_filter($data_check_arr);
    sort($data_check_arr);

    $check_hash = implode("\n", $data_check_arr);
    $secret_key = hash_hmac( 'sha256', $token, "WebAppData", TRUE );
    $hash = bin2hex( hash_hmac( 'sha256', $check_hash, $secret_key, TRUE ) );

    if(strcmp($hash, $check_hash) === 0){
        return true;
    }else{
        return false;
    }
}
Ответ написан
@esurkov1
Рабочее решение
function check_hash($params, $token): bool {
    $hash = $params['hash'];
    unset($params['hash']);

    // Фильтрация пустых значений и сортировка массива по ключам
    $params = array_filter($params);
    ksort($params);

    // Формирование строки для подписи
    $string = implode("\n", array_map(
        function ($key, $value) {
            return $key . '=' . $value;
        },
        array_keys($params),
        $params
    ));

    // Получение секретного ключа
    $secret_key = hash_hmac('sha256', $token, "WebAppData", true);

    // Вычисление HMAC
    $newHash = hash_hmac('sha256', $string, $secret_key);

    // Сравнение полученного хэша с исходным
    return hash_equals($newHash, $hash);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы