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