в чем разница между «MAC недопустим» и «полезная нагрузка недействительна»? - PullRequest
0 голосов
/ 27 мая 2019

Я запускаю два приложения 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 выдает две разные ошибки?почему бы не выдать ту же ошибку, потому что мы отправляем другие данные с другим приложением (значит, это неправильно для второго приложения).

Можете ли вы отличить.Пусть это послужит причиной любой петли безопасности в целом.

Спасибо.

1 Ответ

1 голос
/ 28 мая 2019

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.

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