В чем разница между «MAC недействителен» и «Полезная нагрузка недействительна» laravel?

Я запускаю два приложения laravel 5.7, у обоих разные ключи приложения.

 -->app 1 key 1,
 -->app 2 key 2

[Этот пункт менее важен] Это два приложения (разные модули, основанные на ролях пользователей. Используют разные ключи приложений, но обращаются к одной и той же базе данных).

При шифровании некоторых данных в приложении 1 с помощью ключа 1 теперь расшифровываются зашифрованные данные в приложении 1 с помощью ключа 1. Работает правильно.

Но я меняю зашифрованную строку данных (приложение 1, ключ 1) и пытаюсь снова расшифровать в приложении 1 ключ 1, выдает ошибку «Полезная нагрузка недействительна». Я перевариваю это.

Теперь, во-вторых, я шифрую данные в приложении 1 с помощью ключа 1 и передаю эту зашифрованную строку данных в приложение 2 с ключом 2 для расшифровки, это дает еще одну ошибку «MAC недействителен».

Теперь мой вопрос: почему laravel дает две разные ошибки? почему он не дает ту же ошибку, потому что мы отправляем другие данные с другим приложением (означает, что это неправильно для второго приложения).

Не могли бы вы отличить. Пусть это будет причиной любой петли безопасности.

Спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
1 135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Laravel кодирует и декодирует с помощью base64 игровую нагрузку. Вот взгляните:

/**
 * Get the JSON array from the given payload.
 *
 * @param  string  $payload
 * @return array
 *
 * @throws \Illuminate\Contracts\Encryption\DecryptException
 */
protected function getJsonPayload($payload)
{
    $payload = json_decode(base64_decode($payload), true);

    // If the payload is not valid JSON or does not have the proper keys set we will
    // assume it is invalid and bail out of the routine since we will not be able
    // to decrypt the given value. We'll also check the MAC for this encryption.
    if (! $this->validPayload($payload)) {
        throw new DecryptException('The payload is invalid.');
    }

    if (! $this->validMac($payload)) {
        throw new DecryptException('The MAC is invalid.');
    }

    return $payload;
}


/**
 * Verify that the encryption payload is valid.
 *
 * @param  mixed  $payload
 * @return bool
 */
protected function validPayload($payload)
{
    return is_array($payload) && isset($payload['iv'], $payload['value'], $payload['mac']) &&
           strlen(base64_decode($payload['iv'], true)) === openssl_cipher_iv_length($this->cipher);
}


/**
 * Determine if the MAC for the given payload is valid.
 *
 * @param  array  $payload
 * @return bool
 */
protected function validMac(array $payload)
{
    $calculated = $this->calculateMac($payload, $bytes = random_bytes(16));

    return hash_equals(
        hash_hmac('sha256', $payload['mac'], $bytes, true), $calculated
    );
}

Освещение/Шифрование/Encrypter.php

Как видите, существует двойная проверка: если вы измените полезную нагрузку вручную, она не обязательно будет иметь правильный структура и вернет The payload is invalid.

Затем, когда полезная нагрузка действительна, она попытается использовать MAC. Когда содержание не совпадает, возвращается The MAC is invalid.

Другие вопросы по теме