Как реализовать алгоритм безопасности RS512 или выше на веб-сайте PHP REST? - PullRequest
0 голосов
/ 26 января 2019

Я совершенно новый человек в криптографии. Я пробовал HS256, RS256, но они получили трещины. Где я могу найти учебник по алгоритму безопасности RS512 или выше для PHP REST?

я пробовал с документацией https://github.com/firebase/php-jwt есть документация для RS256. но токен, сгенерированный с использованием этого ключа, взломан здесь https://base64decode.org. Я пробовал и с ключами большей длины. Я попробовал с https://github.com/web-token/jwt-framework Есть описание для компонентов, но вряд ли я мог понять, как его использовать.

$token = array(
   "iss" => $iss,
   "aud" => $aud,
   "iat" => $iat,
   "nbf" => $nbf,
   "exp" => $exp,
   "data" => array(
       "egfield1" => $user->egfield1,
       "egfield2" => $user->egfield2,
       "egfield3" => $user->egfield3,
       "egfield4" => $user->egfield4
   )
);
    //example private
    $privateKey = <<<EOD
    -----BEGIN RSA PRIVATE KEY-----
    MIICXAIBAAKBgQC8kGa1pSjbSYZVebtTRBLxBz5H4i2p/llLCrEeQhta5kaQu/Rn
    vuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t0tyazyZ8JXw+KgXTxldMPEL9
    5+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4ehde/zUxo6UvS7UrBQIDAQAB
    AoGAb/MXV46XxCFRxNuB8LyAtmLDgi/xRnTAlMHjSACddwkyKem8//8eZtw9fzxz
    bWZ/1/doQOuHBGYZU8aDzzj59FZ78dyzNFoF91hbvZKkg+6wGyd/LrGVEB+Xre0J
    Nil0GReM2AHDNZUYRv+HYJPIOrB0CRczLQsgFJ8K6aAD6F0CQQDzbpjYdx10qgK1
    cP59UHiHjPZYC0loEsk7s+hUmT3QHerAQJMZWC11Qrn2N+ybwwNblDKv+s5qgMQ5
    5tNoQ9IfAkEAxkyffU6ythpg/H0Ixe1I2rd0GbF05biIzO/i77Det3n4YsJVlDck
    ZkcvY3SK2iRIL4c9yY6hlIhs+K9wXTtGWwJBAO9Dskl48mO7woPR9uD22jDpNSwe
    k90OMepTjzSvlhjbfuPN1IdhqvSJTDychRwn1kIJ7LQZgQ8fVz9OCFZ/6qMCQGOb
    qaGwHmUK6xzpUbbacnYrIM6nLSkXgOAwv7XXCojvY614ILTK3iXiLBOxPu5Eu13k
    eUz9sHyD6vkgZzjtxXECQAkp4Xerf5TGfQXGXhxIX52yH+N2LtujCdkQZjXAsGdm
    B2zNzvrlgRmgBrklMTrMYgm1NPcW+bRLGcwgW2PTvNM=

-----END RSA PRIVATE KEY-----
EOD;
$jwt = JWT::encode($token, $privateKey, 'RS256');

//example token RS256 generated
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJkZGQuaW4iLCJhdWQiOiJubm4uY29tIiwiaWF0IjoxNTQ4NTA0MDQzLCJuYmYiOjE1NDg1MDQwNDMsImV4cCI6MTU0ODU5MDQ0MywiZGF0YSI6eyJibGFoIGJsYWggYmxhaCI6ImJsYWggYmxhaCBibGFoIn19.Z9PdtP0ziezMxEpVBvgdsLBKndcy1fHDe5I2ypxvd2BEXSXxifLw2zJ3o3bcVZ5MogBaBbZyJOIxHA5M2XnLah90e48wVo5rXlG13edPCnPy4yt6onSfNO86Jbimr-JmQqDiN2oCeFBVCmqWu0wGxHZsyiOfp1dkBuyCJNz6mi0

проблема в том, что он декодируется на этом сайте без ключа

Я не могу понять, что я делаю не так, или алгоритмы взломаны или что-то в этом роде. Пожалуйста, руководство. Спасибо

1 Ответ

0 голосов
/ 30 января 2019

Я думаю, что вы перепутали некоторые понятия. JWT, или более известные как JSON Web Tokens, построены на концепции криптологии кода аутентификации сообщения (MAC).

MAC дает возможность подтвердить, что сообщение пришло от указанного отправителя. Он не «шифрует» данные, поэтому вы можете видеть прямое содержание сообщения.

Base64 - это взаимный переводчик для любого типа данных, JWT будет использовать эту кодировку, чтобы вы могли помещать объекты, массивы или любые другие данные, которые вам нравятся, внутри этих токенов. Только он гарантирует, что в него не было внесено никаких изменений.

Например, пользователь A крадет JWT пользователя B. Он хочет получить доступ к большему количеству данных в течение большего периода времени, поэтому он пытается изменить свойство exp, он не может передать JWT с MAC, поскольку он не знает секрет (в вашем случае, $privateKey).

Когда он отправит новый JWT на ваш сервер, он выдаст InvalidSignatureError, который вы можете поймать с помощью блоков try catch finally.

Это может привести к нескольким ошибкам, таким как токен с истекшим сроком, поэтому я бы предложил использовать catch(Exception $e), а затем поработать с типом ошибки.

Если вы хотите зашифровать содержимое (хотя оно и лишает смысла использование JWT), вы можете использовать LibSodium или контейнер , который я сделал , чтобы упростить его.

Если вы не хотите шифровать $token, не помещайте в токен чувствительные элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...