我运行了两个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会给出两个不同的错误?为什么不给出相同的错误,因为我们通过另一个应用程序发送了另一个数据(这意味着第二个应用程序是错误的)。
能否请您区分。可能是整个安全循环的原因。
谢谢。
答案 0 :(得分: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
);
}
Illuminate/Encryption/Encrypter.php
您会看到有一个双重检查,如果您手动修改有效负载,它不一定具有正确的结构,并且会返回The payload is invalid
。
然后,当有效负载有效时,它将尝试使用MAC。当内容不匹配时,它将返回The MAC is invalid.