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

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

新規登録して質問してみよう
ただいま回答率
85.48%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

Q&A

解決済

2回答

3616閲覧

電話番号をデータベースに追加するときのハッシュ化のアルゴリズムの選択

makkuro

総合スコア57

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

0グッド

2クリップ

投稿2021/04/18 07:52

編集2021/04/18 08:26

ログインに電話番号を使用したいので、データベースには電話番号をハッシュ化して保存しようと思っています。

通常、パスワードをデータベースにハッシュ化して保存する場合、PHPのpassword_hash()関数で、個別にランダムなソルトを追加し、bcryptをコスト10以上で使用すれば、問題ないという認識でいます。

しかし、電話番号の場合、基本的には11桁の数値の固定長なので、bcryptでは十分ではなく、hash_hmac()関数でHMAC-SHA256を使用した方が良いのでしょうか?

HMACでは、秘密鍵が漏れない限り、ハッシュ化された文字列からの復号は現実的な時間(電話番号一つあたりの解析時間が10年以上)で不可能だという認識でいます。

実現したい安全性は、万が一、データベース上から電話番号のハッシュがソルトと一緒に流出した場合に、現実的な時間で、特定のユーザの電話番号を解読されないというものです。

私は暗号について詳しくないので、間違っているところがあればご指摘お願いいたします。

[追記]
HMACを使用した方が良いと思ったのは、以下の記事を読んだからです。

ハッシュ化された電話番号を解読するのは簡単ですか?

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

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

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

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

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

makkuro

2021/04/19 12:59

徳丸さん初めまして。いつも参考にさせていただいております。 > "Qiitaでも質問されているのですね" はい、どちらの方が良いか分からずQiitaでも同様の質問をさせていただいてます。(どちらかのサイトのガイドライン違反でしたら申し訳ありません。) > "そもそも電話番号はIDなのでしょうか、それともパスワードでしょうか?" Qiitaの方でも書かせていただきましたが、電話番号を保存する理由としては、 「SMS認証を行なった後に、電話番号のハッシュを保存して、他のアカウントでSMS認証に使用した電話番号をSMS認証に使用することを防ぎたい」 ということでした。 ただ、どのようなアルゴリズムを使用してハッシュ化しても漏洩するリスクと漏洩したあとのリスクを0にはできなさそうなので、「すでに使用された電話番号を使用できない」という要件は諦めようかなと思っています。 素人の考えなので、ツッコミどころがあれば、ぜひお願いいたします。
ockeghem

2021/04/19 13:18

SMS認証するのに電話番号を保存しないとするなら、いったい何をどうやって認証するのでしょうか?
makkuro

2021/04/19 13:57

すみません、改めて考えると、ご指摘の通り電話番号を保存しなければ意味がありませんでした。 上記のような考え方をしてしまった背景には、以下のような理由があります。 SMS認証といっても二段階認証をするわけではなく、Wikiのような不特定多数の人が編集を行う上で、荒らし防止のためにSMS認証を用いることを検討していました。 IDとパスワードでログイン済のユーザが、権限の必要な操作をするには、SMS認証済である必要がある、というようなものです。 意味合いとしては、これに近いです : https://wikiwiki.jp/pp/sms なので、SMS認証を行ったのちに、SMS認証済のフラグを立てれば良いのでは、と思ったのですが、それでは抑止力(ユーザからはデータベースに電話番号が保存されているように見えるので、荒らし行為がしづらい)にしかならないですね。 何かいい方法はありますでしょうか。
guest

回答2

0

ベストアンサー

情報漏えいのリスクをゼロにする方法はありません。そのような素晴らしい方法があるのであれば、多くのサイトがその方式を採用してメジャーな方法になっているはずですが、現実にはそのような方法はありません。
なので、情報漏えいに至る経路を丹念につぶしていくしかありません。脆弱性対処と認証強化はその基本です。

SMS認証を前提とすると、仮に「荒らし」などがあった場合に投稿者の電話番号が必要になるわけで、ハッシュ系の方法は適切ではありません。HMACを検討されているようですが、どうせ秘密鍵が用いるのであれば、シンプルに暗号化すればよいでしょう。問題は暗号鍵をどこに、どうやって保存するかですが、あいにく単純なベストプラクティスは知られていません。なぜなら、著名なベストプラクティスがあれば攻撃者もその方法を知っているはずなので、たちまち鍵を探しだされてしまうからです。

ということで、ご質問に対する明確な解はありません。いったんは暗号化は気休めと割り切りましょう。現実に、電話番号くらいでしたら平文でデータベースに保存しているサイトが大半ではないかと思います。そして、脆弱性対処とサーバーの認証強化をしっかりしましょう。

しかし、実は「暗号化が功を奏した」という例もあるようです。なので、色々工夫して暗号鍵をうまく隠すことができれば、情報漏えい対策に効果があります。絶対ではありませんが、運が良ければデータを守ってくれます。

データベースの暗号化についてはYouTube動画を作ったものがありますので、参考になさってください。

データベース暗号化の方式と目的 - YouTube

投稿2021/04/19 14:40

ockeghem

総合スコア11701

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

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

makkuro

2021/04/19 14:57

とても分かりやすい解答、ありがとうございます。 YouTubeの動画も拝見させていただきます。
guest

0

実現したい安全性は、万が一、データベース上から電話番号のハッシュがソルトと一緒に流出した場合に、現実的な時間で、特定のユーザの電話番号を解読されないというものです。

「現実的」というのがどのくらいの範囲を指すかにもよりますが、総当たりで突破可能です。

携帯番号は11桁ありますが、決まっている桁もあるので、番号として取れる空間は2億7千万通りしかありません。ハッシュ化に1つ0.1秒かけたとしても、1年あれば携帯番号空間のすべてを総当りできます。

投稿2021/04/18 08:02

maisumakun

総合スコア145184

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

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

maisumakun

2021/04/18 08:04

電話番号の割当状況は総務省から公開されていますので、割当がないと確定している箇所を飛ばせば、もっと効率化できてしまいます。
makkuro

2021/04/18 08:16

わかりやすい解説ありがとうございます。 「現実的」に関しては、1つの電話番号あたり10年以上かかれば現実的ではないと考えます。 以下2点、もし可能であれば教えていただきたいです。 ・HMAC-SHA256でも、秘密鍵が流出していない状態で、同様に現実的な時間で解析されてしまうのでしょうか。 ・電話番号認証を行なっているサービスは多いと思いますが、一般的に電話番号はどのような方法で保存と認証をしているのでしょうか。(技術についてのキーワードや参考サイトがあれば教えていただきたいです。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問