• Как расшифровать JWT токен?

    Stalker_RED
    @Stalker_RED
    Токен состоит из трех частей разделенных точкой. Каждая часть кодируется немного модифицированным base64.
    Первые две раскодируются вообще без ключа. В конце подпись, кодированная ключом. В вашем примере это
    your-256-bit-secret (попробуйте там справа, где синенькое напечатать другой ключ и смотрите как меняется токен).

    <?php
    $key = 'your-256-bit-secret'; // ваш ключ
    $jwtToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
    $jwtArr = array_combine(['header', 'payload', 'signature'], explode('.', $jwtToken));
    
    var_export($jwtArr); /* -> разделяем по точкам
    array (
      'header' => 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9',
      'payload' => 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ',
      'signature' => 'SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c',
    ) */
    
    echo PHP_EOL . base64_decode($jwtArr['header']) . PHP_EOL; // декодированный заголовок
    // -> {"alg":"HS256","typ":"JWT"}
    echo base64_decode($jwtArr['payload']) . PHP_EOL; // декодированная нагрузка
    // -> {"sub":"1234567890","name":"John Doe","iat":1516239022}
    
    $calculatedHash = hash_hmac( // сами считаем хеш
    	'sha256',
    	$jwtArr['header'] . '.' . $jwtArr['payload'],
    	$key,
    	true);
    
    echo base64_encode($calculatedHash) . PHP_EOL;
    // -> SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV/adQssw5c=
    
    echo $jwtArr['signature'] . PHP_EOL;
    // -> SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    // Похоже? Там слегка модифицированный base64


    Третья часть - подпись. Если взять первые две части и получить sha265-хеш с использованием вашего ключа, то он должен совпасть с первой частью. Это подтвердит, что первые две части никто не изменял.

    Хоть бы вики почитал, в самом деле :)
    Ответ написан
    6 комментариев