webサイトの認証機能の作り方 #2「データと暗号化について」

2021年10月4日

テクノロジー

とにかくデータセキュリティには慎重な、ユゲタです。 テレビやニュースなどでよく聞く個人情報漏洩の話は、技術的な漏洩というよりも、人為的に盗まれることのほうが多いという事実をご存知でしょうか? 2018年情報セキュリティインシデントに関する調査結果~個人情報漏えい編~ この資料をみると、 データの入ったパソコンの置き忘れや、誤操作が、半数以上を占めているのがわかります。 でも、これらも怖いのもわかりますが、ニュース性の高い漏洩で考えると、作為的に企業内の担当者がデータを持ち出して、不正なデータを買い取るアングラな組織に対してこっそり販売してしまうケースです。 これは、悪気がある従業員がいたらなかなか防げませんよね。 結果的に、従業員に対して、裏で作業を監視するような処置をとらなくてはいけなくなります。 そんな下世話な話もあることを考慮して、ログインなどの認証システムにおけるデータについて考えてみたいと思います。

データベースの種類は関係ない

SQLから、No-SQL、その他にもファイルに保存するデータなど、いろいろな箇所にデータを保存して、それをシステムで利用するかと思いますが、 データベースによって、セキュリティの質は対して変わりません。 結局システムで利用するデータベースなので、攻撃などによって、SQLインジェクションが狙われるという事はありますが、多くの場合は、システム経由でデータを持ち出されるケースが多いでしょう。 そうならないためのシステム構築をしないといけないのは間違いないですね。

データの必要最低限と暗号化

ログインシステムをサンプルにすると、「メールアドレス」と「パスワード」のログインをするアカウントに対して、データとして必要な項目はどういった物があるでしょうか? まちがいなく、「メールアドレス」と「パスワード」をデータベースに保存しておくのが良いと考えてしまうでしょうが、少なくてもパスワードは暗号化されていて、その文字列では復元ができない状態にしておくことが重要でしょうね。 パスワードの文字列を暗号化して復号化できないとすると、どうやって認証するかと言うと、文字列一致ではなく、それぞれの言語で持っている特定の暗号化されたデータをパスワードを元に、マッチするかどうかを判定する機能がだいたいあります。 PHPで言うところの、password_verify関数で、 password_verify(%パスワード , %暗号化されたパスワード); こうすることで、booleanでtrueまたはfalseの結果が得られます。 便利ですね〜。 そして、運用側でも、利用者のパスワードが認識できなくなるので、内部犯行もできなくなるという対策にもなります。 仮にメールアドレスと、暗号化されたパスワード一覧が、一式漏れたとしても、そのままログインできる状態にはならないでしょう。

独自の暗号化システムを持つと強い話

暗号化ってなんだか難しい領域に感じている人もいるかもしれませんが、自分しか解読できない暗号化システムが作れると、非常に有効なシステムになる可能性があります。 もちろん、コンピュータで暗号化して復号化できるという事を考えると、それらの仕組みが簡単に推測されてしまうようではいけません。 鍵を元に暗号化したら、それは解読されにくいと思っても、最近のコンピュータの性能であれば、かなり短時間で鍵文字列は解読されてしまいます。 世の中に実用的な量子コンピュータができあがってしまうと、かなりビット数の高い暗号でも、ものの一瞬で解読されてしまうという事が今現在危惧されています。 ※量子コンピュータの説明は今回は省きます。 とにかく、認証システムにおける暗号化という技術で一般的なライブラリや、主流な方法、ネットで書かれているコードのコピペなどでやってしまうと、解読される確率は非常に高くなってしまうことは、言うまでもありません。 特許を取るつもりぐらいの間隔で、暗号化処理プログラムを作ってみると、なんだか素敵な未来が待っているかもしれませんね。