Laravel Encryptable Trait Failing Authentication - PullRequest
0 голосов
/ 26 апреля 2018

У меня проблемы с обработкой аутентификации в моем Laravel 5.5. Я установил черту Encryptable согласно этой записи здесь . Затем я использовал генератор аутентификации, чтобы установить базовые маршруты, представления и обработчик.

Я могу успешно зарегистрировать новые учетные записи и визуально увидеть, что все данные зашифрованы, но я не могу успешно пройти аутентификацию через экран входа в систему.

Кажется, что это сбой во время вызова Auth::attempt($credentials). Мое устранение неполадок указывает на зашифрованную черту, потому что, когда я закомментирую этот раздел, аутентификация работает нормально.

Может ли кто-нибудь подсказать, как обрабатывать аутентификацию с использованием этого метода шифрования модели?

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

1-е редактирование: Итак, с пониманием того, как работают черты ... черта Encryptable, кажется, перегружает функции getAttribute / setAttribute. Это будет означать, что запрашивающие функции Eloquent, такие как where, find и т. Д., Будут просто «просматривать» зашифрованные значения.

2-е редактирование: Исходный код, предоставленный для черты Encryptable, не возвращал правильные значения для незашифрованных значений. Это было изменено, и аутентификация была восстановлена. Для тех, кто использует тот же фрагмент кода, в функции get_attribute() измените блок else так, чтобы он return $value;.

Я ценю все идеи, Dan

1 Ответ

0 голосов
/ 26 апреля 2018

Эта форма шифрования лишает вас возможности искать в таблице зашифрованные поля. Вы не сможете воспроизвести ту же строку, потому что Laravel использует случайный iv при создании зашифрованных данных. IV, или вектор инициализации, выполняет те же функции, что и соль при хешировании, для рандомизации хранимых данных.

Из-за этой рандомизации данных вы даже не сможете выполнить поиск в своей таблице, повторно зашифровав данные поиска:

User::where('email', Crypt::encrypt('email@email.com')); 
// won't find anything even if an encrypted value of email@email.com exists

Запуск в интерактивной оболочке позволяет увидеть, что шифрование возвращает совершенно другое значение при последующих запусках:

>>> json_decode(base64_decode(Crypt::encrypt('email@email.com')))->value
=> "zpA0LBsbkGCAagxLYB6kiqwJZmm7HSCVm4QrUw6W8SE="
>>> json_decode(base64_decode(Crypt::encrypt('email@email.com')))->value
=> "VKz8CWVzR66cv/J7J09K+TIVwQPxcIg+SDqQ32Sr7rU="

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...