Laravelでメールアドレスを暗号化・復号化

Laravelでメールアドレスを暗号化・復号化して使用する時のメモ。

やりたいこと

  • 保存する時にメールアドレスを暗号化
  • 取り出す時にメールアドレスを復号化

暗号化・復号化自体はこちらの記事を参考にLaravelの機能を使って簡単にできた。 【Laravel 5.4】モデルのフィールドの暗号化・復号化

課題

参考記事内でも言及されているが暗号化した際の値が毎回変わるのでバリデーション時に一致せず、同じメールアドレスで複数のアカウントを登録できる状態になってしまった。参考記事では自作クラスを作成して解決されたようだが、私の場合は引き継ぎを前提とした開発だったので、なるべく認証周りに大きな変更を加えたり自前で何かを作ることはせずにlaravelの標準的な機能で完結させたかった。

対応

メールアドレスをsha256でハッシュ化した値を格納するカラムを別で作成して、それを登録時やログイン時のチェックに使用することにした。

/app/Http/Controllers/Auth/RegisterController.php

    protected function validator(array $data)
    {
        $data['encrypted_email'] = hash('sha256', $data['email']);
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
            'encrypted_email' => 'required|string|unique:users',
        ]);
    }

登録時はencrypted_emailのバリデーションを追加している。

/app/Http/Controllers/Auth/LoginController.php

use Illuminate\Http\Request;

class LoginController extends Controller
{
    (省略)

    protected function credentials(Request $request)
    {
        return ['encrypted_email' => hash('sha256', $request->email), 'password' => $request->password];
    }
}

ログイン時は認証キーをencrypted_emailに変更している。あとはメールアドレスを更新した際にencrypted_emailのカラムも同時に更新するなど細かい修正を加えている。

参考