Есть ли способ изменить алгоритм шифрования Laravel, чтобы он генерировал одно и то же значение для одной и той же строки? - PullRequest
0 голосов
/ 05 апреля 2019

Я сохраняю зашифрованные данные пользователя (включая электронную почту пользователя, которая используется для входа в систему) с помощью встроенного в 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 Ответ

2 голосов
/ 05 апреля 2019

Ты не. Зашифрованная полезная нагрузка должна * каждый раз отличаться , даже если один и тот же открытый текст зашифрован. Ларавел делает это правильно.

Причиной такого поведения является защита от взлома алгоритма и секрета, используемых для шифрования. Если одна и та же полезная нагрузка дает точно такой же зашифрованный текст, ее на порядок проще взломать.

То, что вы просите, даже не решит вашу проблему. Решение вашей проблемы - это не изменение схемы шифрования, это нечто совершенно иное. Подумайте об удалении этого вопроса и спросите о вашей реальной проблеме, а не о попытках ее решения.

...