私はウェブサイトを構築していて、ユーザーのメールアドレスを暗号化する方法を見つけようとしています。データベースが盗まれた場合に備えて、ユーザーの電子メールがプレーンテキストでなかったとしたら、すばらしいと思います。ユーザーがログインするにはメールが必要であることは明らかだったので、パスワードをキーにしてメールを暗号化した場合、またはメール自体を暗号化した場合でも、ログイン機能を構築できれば機能します。
ユーザーのメールアドレスが必要な場合に問題が発生します。たとえば、パスワードのリセットやニュースレターの送信などの状況です。私が知っているキーで暗号化されたユーザーの電子メールアドレスをデータベースの2番目のフィールドに含めることができます。
2つのキーが機能するものを暗号化できますか?マスターキーのように.......または私は愚かですか?
ユーザーが電子メールを提供するときに電子メールを確認するだけでよい場合は、パスワードをハッシュするのと同じ方法で vidarloが提案する のようにハッシュします。ここでは暗号化は必要ありません。このアプローチの反対面は、本当に必要な場合でも(たとえば、コメントで示唆されているように、侵害が発生した場合にユーザーに連絡するため)、メールを回復することはできないということです。
電子メールを取得できるようにする必要がある場合は、制御するキーを使用して一度暗号化します。ここでは、異なる目的でメールを2回暗号化する必要はありません。1回だけ暗号化してください。このソリューションのトリッキーな部分は キーを保存する場所 です。
ユーザーの電子メールアドレスは本当に必要ですか。
電子メールアドレスをハッシュ(電子メール+ salt):saltとして保存すると、ユーザーが提供した電子メールアドレスを簡単に確認できます。ユーザーがパスワードのリセットを要求した場合は、電子メールアドレスが一致していることを確認し、ユーザーが指定した電子メールに電子メールを送信します。
電子メールアドレス(たとえば、ユーザー名が電子メールである)に基づいてデータベースの検索を許可する場合、このモデルは明らかに機能しません。ただし、 Conor Mancone で指摘されているように、すべてのアドレスのグローバルコショウは機能しますが、セキュリティが多少低下します。
これにより、ニュースレターを送信する可能性が明らかになくなります。しかし、それはデータベース違反が電子メールアドレスを明らかにしないことを意味します。
既存の回答に代わる方法:メールを別のマシンとアプリケーションに置き、ハッシュのみをメインのアプリケーションDBに保存します。
ハッシュを使用してメールを確認します。
電子メールを送信する必要がある場合、アプリケーションはハッシュ+電子メールメッセージを渡してこの他のサービスと通信し、他のアプリケーションは電子メールを送信します。
ハッカーがセカンダリマシンをハッキングしてメールにアクセスできることは明らかですが、次の理由により、セキュリティを追加しています。
そのため、セカンダリマシンの攻撃面はwayがアプリケーションのものより小さくなる可能性があります。
ボーナスポイント:セカンダリマシンに他の回答を適用して、セキュリティをさらに高めることができます(ただし、すでにハッキングされていると想定した場合、完璧ではありません...)
ログインするにはメールアドレスを検索する必要があります。メールアドレスが適切にハッシュされている場合、スケーラブルではありません。システムに1万人のユーザーがいる場合、ソルトのため、ログインごとに平均5万回ユーザーのメールをハッシュする必要があります。
あなたの前提を質問してもいいですか?
「ユーザーが明らかにログインするにはメールが必要だと思った」
代わりにユーザー名を発行しない(またはユーザーに選択させる)のはなぜですか?これは、メールに非常に近いユーザー名を選択しない限り、メールに関連付けられません。
もちろん、パスワードのリセットを行う場合でもメールは必要ですが、これを提供できなかったか、別の方法(サインアップ時に指定されたOTPコードなど)を使用するか、メール用のユーザー名の個別のデータベースを保持します。