web-dev-qa-db-ja.com

PHPでのメールアドレスの暗号化

私はウェブサイトを構築していて、ユーザーのメールアドレスを暗号化する方法を見つけようとしています。データベースが盗まれた場合に備えて、ユーザーの電子メールがプレーンテキストでなかったとしたら、すばらしいと思います。ユーザーがログインするにはメールが必要であることは明らかだったので、パスワードをキーにしてメールを暗号化した場合、またはメール自体を暗号化した場合でも、ログイン機能を構築できれば機能します。

ユーザーのメールアドレスが必要な場合に問題が発生します。たとえば、パスワードのリセットやニュースレターの送信などの状況です。私が知っているキーで暗号化されたユーザーの電子メールアドレスをデータベースの2番目のフィールドに含めることができます。

2つのキーが機能するものを暗号化できますか?マスターキーのように.......または私は愚かですか?

10
Jason

ユーザーが電子メールを提供するときに電子メールを確認するだけでよい場合は、パスワードをハッシュするのと同じ方法で vidarloが提案する のようにハッシュします。ここでは暗号化は必要ありません。このアプローチの反対面は、本当に必要な場合でも(たとえば、コメントで示唆されているように、侵害が発生した場合にユーザーに連絡するため)、メールを回復することはできないということです。

電子メールを取得できるようにする必要がある場合は、制御するキーを使用して一度暗号化します。ここでは、異なる目的でメールを2回暗号化する必要はありません。1回だけ暗号化してください。このソリューションのトリッキーな部分は キーを保存する場所 です。

17
Anders

ユーザーの電子メールアドレスは本当に必要ですか。

電子メールアドレスをハッシュ(電子メール+ salt):saltとして保存すると、ユーザーが提供した電子メールアドレスを簡単に確認できます。ユーザーがパスワードのリセットを要求した場合は、電子メールアドレスが一致していることを確認し、ユーザーが指定した電子メールに電子メールを送信します。

電子メールアドレス(たとえば、ユーザー名が電子メールである)に基づいてデータベースの検索を許可する場合、このモデルは明らかに機能しません。ただし、 Conor Mancone で指摘されているように、すべてのアドレスのグローバルコショウは機能しますが、セキュリティが多少低下します。

これにより、ニュースレターを送信する可能性が明らかになくなります。しかし、それはデータベース違反が電子メールアドレスを明らかにしないことを意味します。

11
vidarlo

既存の回答に代わる方法:メールを別のマシンとアプリケーションに置き、ハッシュのみをメインのアプリケーションDBに保存します。

ハッシュを使用してメールを確認します。

電子メールを送信する必要がある場合、アプリケーションはハッシュ+電子メールメッセージを渡してこの他のサービスと通信し、他のアプリケーションは電子メールを送信します。

ハッカーがセカンダリマシンをハッキングしてメールにアクセスできることは明らかですが、次の理由により、セキュリティを追加しています。

  1. セカンダリマシンをインターネットに公開する必要はありません
  2. セカンダリマシンは非常に最小限にすることができ、very限定されたAPIをアプリケーションに公開し、メールを送信するサービスがあれば十分です
  3. それは非常に特定のことしかしないので、多くのことを封鎖することができます

そのため、セカンダリマシンの攻撃面はwayがアプリケーションのものより小さくなる可能性があります。

ボーナスポイント:セカンダリマシンに他の回答を適用して、セキュリティをさらに高めることができます(ただし、すでにハッキングされていると想定した場合、完璧ではありません...)

6
Giacomo Alzetta

ログインするにはメールアドレスを検索する必要があります。メールアドレスが適切にハッシュされている場合、スケーラブルではありません。システムに1万人のユーザーがいる場合、ソルトのため、ログインごとに平均5万回ユーザーのメールをハッシュする必要があります。

あなたの前提を質問してもいいですか?

「ユーザーが明らかにログインするにはメールが必要だと思った」

代わりにユーザー名を発行しない(またはユーザーに選択させる)のはなぜですか?これは、メールに非常に近いユーザー名を選択しない限り、メールに関連付けられません。

もちろん、パスワードのリセットを行う場合でもメールは必要ですが、これを提供できなかったか、別の方法(サインアップ時に指定されたOTPコードなど)を使用するか、メール用のユーザー名の個別のデータベースを保持します。

2
Daniel Williams