关于Laravel加密的问题

时间:2016-12-21 23:16:04

标签: php laravel encryption laravel-5 laravel-5.3

我对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?

  • 为什么值为json_encoded?这用于保持一个干净的阵列或其他意图吗?目前,在我班级的encrypt()方法中,我只是连接加密的$value$iv(初始化向量)。在解密时,我再次将它们分开。

  • 当openssl_encrypt throw无法加密数据时,它已经抛出了异常吗?为什么会检查返回值?

如果有人花一点时间看一下指定行上的github回购,我会非常高兴。

干杯!

1 个答案:

答案 0 :(得分:1)

  

为什么laravel将加密值序列化?如果它总是一个字符串,这个方法采用序列化数据的优点是什么?

该功能不仅仅是一个字符串。它采用任何(可序列化的)数据类型。它序列化输入值以将其转换为字符串;一个可以在解密时返回其原始类型的。我知道函数上面的PhpDoc声明参数是一个字符串,但这似乎是错误的,需要更改为mixed

  

为什么在这里使用base64_encode?

在$ iv上使用<64> base64编码,通过hash方法将随机字节转换为可用字符串。

至于base64编码的返回值,我不知道。看起来好像他们可以将它留作json编码的字符串,但也许他们想确保返回的字符串没有任何特殊字符,或者他们可能需要再进行一次混淆。

  

为什么值为json_encoded?这用于保持一个干净的阵列或其他意图吗?目前在我班级的encrypt()方法中,我简单地连接加密的$ value和$ iv(初始化向量)。在解密时,我再次将它们分开。

是的,json_encoding只是为了帮助提供干净且易于解析的有效负载。它们需要跟踪三个值,并且能够保持值分离的最简单,最干净的方法是使用数组。

  

openssl_encrypt投掷无法加密数据时,已经抛出异常了吗?如果是这种情况,为什么要检查返回值?

我在PHP documentation中看不到openssl_encrypt会引发异常的任何迹象。但是,它确实声明它在失败时返回false,这是严格检查false的原因。

现在,有两个原因导致它可能会发出一个PHP警告,Laravel会将其转换为异常,但这些只是加密可能失败的两种方式。