質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

1103閲覧

暗号化したメールアドレスの重複チェックについて

ry_

総合スコア11

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2019/08/10 13:51

状況

ユーザー名、メールアドレス、パスワードで会員登録をしてもらうwebサービスを考えています。
パスワードは認証時に見比べるのに使うだけなのでハッシュ化して保存しているのですが、メールアドレスはハッシュ化してしまったら使えなくなってしまうので、暗号化し、必要なときに復号化できるようにすればいいのかなと考えました。

実現したいこと

同じメールアドレスでは登録できないように、入力されたメールアドレスがすでにデータベースに存在するかのチェックをしたい。

わからないこと

データベースには暗号化されたメールアドレスが入っているので、入力されたメールアドレスと一致するものがあるのかは復号化しないとチェックができない。

一応わからないなりに、二つのやり方を考えました。

  • すべてのメールアドレスを復号化してチェックする
  • チェック専用で暗号化とは別にハッシュ化したアドレスも保存して見比べる

どちらが適切か、またはどちらも適切でない場合、
他にどのような方法があるのかを教えてください。
お願いします。

使うもの

express
mariaDB
nodeのcryptoモジュール
暗号化のアルゴリズムはaes-256-cbc

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

scsi

2019/08/10 14:12

素朴な疑問ですがメールアドレスを暗号化する必要があるんですか?
ry_

2019/08/10 15:39

すみません、個人で勉強しててとりあえずやってみよう!の段階で全然知識がないのです。 暗号化する必要はそもそもないのでしょうか? それかメールアドレスへの対策ではなく、何か別の方面からの保護の仕方があるのでしょうか?
scsi

2019/08/10 22:06

第三者に不正にDBにアクセスされた場合に複合化の仕組みも盗まれる可能性が高いので、わざわざ暗号化する必要はないかなと思いました!
mokemokechicken

2019/08/10 22:44

ビジネス的な要件でメールアドレス(や個人情報等)を暗号化してくれ、というのは無くはない(最近は多いのかなぁ?)ですが、そこまで多くはないという印象ですね。(大抵は)企業のポリシーに依ります。 法的には必須ではないです(預かった個人情報が簡単には流出しないようになっていれば良い)。 なので、通常は「やらなくてよければ暗号化まではやらない」ことが多い気がします。 でも、必要なこともやはりあるので、仕組みを考えておくこと自体は意味はあると思います。
ry_

2019/08/11 02:57

復号化の仕組みが盗まれる可能性…あらゆる可能性を考えるときりがなさそうな分野なのですね…。 そもそもDB内部のデータの暗号化云々より、DBそのもののセキュリティさえしっかりしておけば、 特に厳しい案件でもない限りは施す必要はあまりない処理、ということでいいのでしょうか?
mokemokechicken

2019/08/11 03:17 編集

> そもそもDB内部のデータの暗号化云々より、DBそのもののセキュリティさえしっかりしておけば、 > 特に厳しい案件でもない限りは施す必要はあまりない処理、ということでいいのでしょうか? そうですね。私の認識ではそうです。 が、少し緩めの感覚だと思ってもらっても良いかもしれません。 ※ 今後その辺の要求は厳しくなっていくでしょう 気をつけるのはどこに脅威があるか、なのだと思います。 - そのサーバにLoginできる他社の人がいる場合、セキュリティホールを突かれてroot権限昇格されて、ファイルシステム毎コピーされるリスクをどう考えるか (ファイルシステムを暗号化しておけば安全?) - DBバックアップしたデータに個人情報が含まれるので、その安全性はどうなのか? (多くの人が触れる場所にバックアップがあるなら、内部が暗号化されていたほうが安全)(バックアップファイルを厳重に管理しておけば安全??) などなど、、、考えるときりがなく、どこで線を引くかという話になりますね。 多くの場合は - 内部の人は信用する! (ので、社内エンジニアが簡単にみれちゃうのはOK!) - サーバはCrackされないとする みたいなところで線を引いている気がします。
ry_

2019/08/11 06:22

どこに脅威があるのか、経験や知識が必要そうですね…。 わかりました。DBのプログラム的な勉強以外にも、実現したい機能や環境でどんな脅威があるのかの認識と、あとは+コストや要求などに合わせて線引きですね。 デザイナー寄りが勝手に勉強してることなので、気長に覚えていこうと思います。とても勉強になりました。お二方ともありがとうございます!
guest

回答1

0

ベストアンサー

一意見ですが、以下のように思いました。

  • すべてのメールアドレスを復号化してチェックする

やらない方が良さそう。
理由: 復号化処理がDB内でできたとしても、Index化などはおそらく難しいので、全行をScanする必要があるので、非常に実行コストが高くなる。

  • チェック専用で暗号化とは別にハッシュ化したアドレスも保存して見比べる

良さそう。
理由: Hash化した文字列は普通にIndexが効くので検索効率は良い。またセキュリティ面でも特に弱くなってはいない(パスワードのようにHash化すれば)。1列余分に増えるので多少コストはあるが通常は許容できる範囲。
※ 追記1
欠点: 極めて低い確率だが「異なる2つのメールアドレス」が「同じHash文字列」になることがある。その場合「登録済みです」となると、ユーザが「まだ登録していないのに、なんてことだ!」となってしまう。
→対処方法: なので、Hash化したメールアドレスの該当レコードがあった場合、念の為メールアドレスも復号化してそれもちゃんと一致するかを検証した方が良さそうですね。(該当レコードが複数あることもあるので注意は必要かも)。

※ もっといい方法があるのかなぁ...

投稿2019/08/10 14:29

編集2019/08/10 14:34
mokemokechicken

総合スコア948

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ry_

2019/08/10 16:11

迅速な回答ありがとうございます。 やはりすべての復号化は現実的ではないですよね。 なるほど、ハッシュ化で絞り込んだうえで被るものがあれば復号化し、ちゃんと検証する、そこまで考えていませんでした。ありがとうございます! もう少し他に回答してくださる方がいるかもしれないので待機しますが、 二つ目の案で問題なさそうであれば、教えていただいた検証含め実装し、テストしてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問