多数のユーザーでWebサービスを実行しているときにハッキングされた場合、メールのようなプレーンテキスト情報やパスワードハッシュのようなハッシュを提供している可能性があります。
メールアドレスもハッシュとして保存する価値はありますか?
あなた自身に尋ねる必要がある最初の質問は、あなたのサービスはそもそもメールアドレスを必要としますか、そしてそのメールアドレスは何のために必要ですか?
メールアドレスが必要ない場合は、保存しないでください。
電子メールアドレスを知る必要があり、ハッシュされたバージョンでこれらのすべてのニーズを満たすことができる場合は、ハッシュだけを保存することをお勧めします。
ハッシュでは満足できない目的でメールアドレスを知る必要がある場合は、ハッシュだけを保存することはお勧めできません。たとえば、ユーザーにメールを送信する必要がある場合、ハッシュだけでは送信できない可能性があります。
ハッシュされたメールアドレスの現実的な使用例
ユーザーがメールアドレスとパスワードを使用してログインできるサイトを想像してみてください。ユーザーがユーザー名を持っている場合もありますが、これはこの回答の範囲外です。
ユーザーがログインしたら、メールアドレスとパスワードを入力します。データベースでその電子メールアドレスを見つけるには、ハッシュ値で十分です。単にハッシュだけを保存することができ、ルックアップを行う前に、ユーザーから提供された値をハッシュします。
単純な無塩ハッシュを実行しただけでも、それらの値は異なるサイト間で比較できます(たとえば、このアプローチを使用する複数のサイトにデータリークがあった場合)。一方、ユーザーごとに固有のソルトを使用したハッシュは、パスワードのベストプラクティスでも機能しません。ユーザーをデータベースのすべてのエントリと比較するのは、あまりにも非効率的です。
代わりに、サイト全体のソルトを頻繁に(年に1回など)変更して、これまでに使用したすべてのソルト値を使用して各ログインを試行できるようにすることができます。
これにより、メールアドレスを保存する必要なく、メールでデータベース内のユーザーを検索できます。もちろん、パスワードは、保存されているすべてのパスワードに固有のソルトを使用したパスワードハッシュを使用して保存されます。
パスワードリセットのメールを送信する機能が必要な場合は、それも可能です。ユーザーが自分の電子メールを入力してパスワードリセットの電子メールを受信すると、ログインの場合と同じ方法でデータベースで電子メールを検索できます。
ユーザーがログインしている間もユーザーにメールを表示したい場合は、ハッシュをキーとして使用して、メールアドレスの暗号化されたバージョンを含むCookieをブラウザーに保存できます。
一般的に言って、必要のないユーザーデータ(特にPII)を尋ねて保持するべきではありません。これは今ではさらに真実です GDPRの下で (シナリオに当てはまる場合)。セキュリティのケース。データが少ないほど、リスクは低くなります。
パスワードをハッシュすると、平文バージョンについて 知識が失われます であり、電子メールとパスワードをハッシュする価値があるかどうかを尋ねているという事実から、おそらくその情報は本当に必要ないと思いますそもそも。
そうは言っても、(ロギング以外の目的で)電子メールが必要な場合は、そうすることでその情報を失うことになるので、それらをハッシュすることはできません。その場合、代わりに [〜#〜] aes [〜#〜] / [〜#〜] hmac [〜#〜] を使用してデータを暗号化/認証することをお勧めします=または Chacha2 / Poly1305 または同様。
別のアプローチは [〜#〜] pake [〜#〜] を使用することです:電子メール、パスワード、インターネット経由で転送する必要はありません!この例として、 [〜#〜] srp [〜#〜] または [〜#〜] opaque [〜#〜] があります。