有没有一种方法可以更改Laravel加密算法,从而针对相同的字符串生成相同的值?

时间:2019-04-05 13:44:16

标签: php laravel laravel-encryption

我正在使用Laravel内置的加密方法保存加密的用户数据(包括用于登录的用户电子邮件)。

登录时,我必须提供加密的电子邮件以进行身份​​验证,但是加密算法每次都会针对相同的字符串生成一个不同的字符串。

我正在使用以下特征来保存加密数据。

我该如何克服呢?

namespace App\Traits;

use Illuminate\Support\Facades\Crypt;

/**
 * Class Encryptable
 * @package App\Traits
 */
trait Encryptable
{
    /**
     * If the attribute is in the encryptable array
     * then decrypt it.
     *
     * @param  $key
     *
     * @return $value
     */
    public function getAttribute($key)
    {
        $value = parent::getAttribute($key);

        if (in_array($key, $this->encryptable) && $value !== '')
            $value = Crypt::decrypt($value);

        return $value;
    }

    /**
     * If the attribute is in the encryptable array
     * then encrypt it.
     *
     * @param  $key
     *
     * @return $value
     */
    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->encryptable))
            $value = Crypt::encrypt($value);

        return parent::setAttribute($key, $value);
    }

    /**
     * When need to make sure that we iterate through
     * all the keys.
     *
     * @return array
     */
    public function attributesToArray()
    {
        $attributes = parent::attributesToArray();

        foreach ($this->encryptable as $key)
        {
            if (isset($attributes[$key]))
                $attributes[$key] = Crypt::decrypt($attributes[$key]);
        }

        return $attributes;
    }
}

在用户模型中的用法

namespace App;

use App\Traits\Encryptable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Encryptable;

    protected $encryptable = [
        'first_name',
        'sur_name',
        'email',
        'mobile',
    ];
}

1 个答案:

答案 0 :(得分:2)

你不知道。每次加密的有效载荷必须都不同,即使相同的明文被加密也是如此。 Laravel正确地做到了。

此行为的原因是防止破解用于加密的算法和机密。如果相同的有效载荷产生的密文完全相同,则破解它的数量级将更容易。

您要的甚至无法解决您的问题。解决您的问题的方法不是更改加密方案,而是完全不同。考虑删除此问题,并询问您的实际问题,而不是您尝试的解决方案。