我对Laravel的Encrypt类有一些疑问。我希望有人能回答他们。
这主要是关于第70行的encrypt
方法:
https://github.com/illuminate/encryption/blob/master/Encrypter.php#L70
public function encrypt($value)
{
$iv = random_bytes(16);
$value = \openssl_encrypt(
serialize($value), $this->cipher, $this->key, 0, $iv
);
if ($value === false) {
throw new EncryptException('Could not encrypt the data.');
}
$mac = $this->hash($iv = base64_encode($iv), $value);
$json = json_encode(compact('iv', 'value', 'mac'));
if (! is_string($json)) {
throw new EncryptException('Could not encrypt the data.');
}
return base64_encode($json);
}
我已经了解了openssl_encrypt,它似乎非常适合个人用例。我使用它进行了加密和解密方法。
Laravel做的不仅仅是简单的加密。
为什么laravel将加密值序列化?如果它总是一个字符串,这个方法采用序列化数据的优点是什么?
为什么在这里使用base64_encode? p>
为什么值为json_encoded?这用于保持一个干净的阵列或其他意图吗?目前,在我班级的encrypt()
方法中,我只是连接加密的$value
和$iv
(初始化向量)。在解密时,我再次将它们分开。
当openssl_encrypt throw无法加密数据时,它已经抛出了异常吗?为什么会检查返回值?
如果有人花一点时间看一下指定行上的github回购,我会非常高兴。
干杯!
答案 0 :(得分:1)
为什么laravel将加密值序列化?如果它总是一个字符串,这个方法采用序列化数据的优点是什么?
该功能不仅仅是一个字符串。它采用任何(可序列化的)数据类型。它序列化输入值以将其转换为字符串;一个可以在解密时返回其原始类型的。我知道函数上面的PhpDoc声明参数是一个字符串,但这似乎是错误的,需要更改为mixed
。
在$ iv上使用<64> base64编码,通过为什么在这里使用base64_encode? p>
hash
方法将随机字节转换为可用字符串。
至于base64编码的返回值,我不知道。看起来好像他们可以将它留作json编码的字符串,但也许他们想确保返回的字符串没有任何特殊字符,或者他们可能需要再进行一次混淆。
为什么值为json_encoded?这用于保持一个干净的阵列或其他意图吗?目前在我班级的encrypt()方法中,我简单地连接加密的$ value和$ iv(初始化向量)。在解密时,我再次将它们分开。
是的,json_encoding只是为了帮助提供干净且易于解析的有效负载。它们需要跟踪三个值,并且能够保持值分离的最简单,最干净的方法是使用数组。
当
openssl_encrypt
投掷无法加密数据时,已经抛出异常了吗?如果是这种情况,为什么要检查返回值?
我在PHP documentation中看不到openssl_encrypt
会引发异常的任何迹象。但是,它确实声明它在失败时返回false
,这是严格检查false
的原因。
现在,有两个原因导致它可能会发出一个PHP警告,Laravel会将其转换为异常,但这些只是加密可能失败的两种方式。