なぜパスワードはハッシュ化すべきか?

なぜパスワードはハッシュ化すべきか?

2020年12月11日

毎週木曜日に配信している「データサイン・ランチタイムトーク」の模様をレポートします。当記事で取り上げるのは以下の配信です。

  • 配信日:2020年11月19日 
  • タイトル: なぜパスワードはハッシュ化すべきか?
  • 発表者:株式会社データサイン ビジネスデベロップメント 宮崎洋史、プロダクトマネージャー 坂本一仁

元データを変換してランダムな文字列を生成するハッシュ関数

データサインでは、ランチタイムトークで新たな試みを始めました。デジタル広告やプライバシー関連のニュースがもっと身近に感じられるようになる「技術解説」シリーズです。記念すべき第一弾のテーマは、「ハッシュ」。相次ぐ企業サイトからのパスワード漏洩事件、そして著作権管理に用いられるブロックチェーンの話題でしばしば登場するワードですが、どのような技術なのでしょう。データサインのビジネスデベロッパー 宮崎洋史と、プロダクトマネージャー 坂本一仁が、できるだけわかりやすく解説してみました。

ハッシュ値とは、あるデータから所定の計算手順(アルゴリズム)によって算出される値のこと。手順を実装したプログラムはハッシュ関数と称します。データの一例は、テキストなどの文字列ですが、ほかにも静止画像や動画、音楽データ、コンピュータープログラムなどさまざまな形式のファイルがハッシュ値へ変換可能です。ハッシュ関数は複数存在しますが、MD5、SHA1、SHA2(SHA256やSHA 512)が有名です。

さて、インターネット上には、無償で利用できるハッシュ値の生成サイトがあります。そちらで試しに「1234」という数をSHA2(SHA512)でハッシュ化してみます。すると「D404559F602EAB6FD602AC7680DACBFAADD13630335E951F097AF3900E9DE176B6DB28512F2E000B9D04FBA5133E8B1C6E8DF59DB3A8AB9D60BE4B97CC9E81DB」という、128桁のランダムな文字列が生成されます(英字に大文字/小文字の区別はありません)。

ハッシュ値の特徴は、

  • 元データの文字列が何文字でも(1文字でも100文字でも)、同じ文字数(桁数)になる
  • 元データが同じであれば、同じ計算アルゴリズムを用いる限り、同じハッシュ値が生成される
  • 生成されたハッシュ値から元データに復元することはできない(一方向性)

などです。

異なるハッシュ値が一致することは起こり得る?

しかし、ハッシュ値の桁数が一定(固定長)であるために、異なる元データがごくまれに同一のハッシュ値になってしまうことが原理上、起こり得ます。これを「衝突」といいます。

ただし、先ほど計算に使用したSHA2(SHA512)の場合、衝突する確率はほぼゼロ、と実務上は考えて差し支えありません。というのも、128桁あるハッシュ値の各桁は、それぞれ0から9までの数字およびAからFまでの英字、つまり16種類の英数字で表された16進数です。128桁で表せる数字は、16×16×16×・・・、すなわち「16の128乗」通り。ピンと来ないかもしれませんが、組み合わせの数は「2の512乗」つまり512ビット分の情報量に等しく、私たちが普段用いる10進数でいう約155桁、すなわち42.9億を16回掛け算してやっと得られる、まさに気の遠くなるような桁数で表される文字列に変換されます。

「天文学的な桁数なので、衝突する元データを見つけるには現行のコンピューターの仕組みでは時間がかかり過ぎ、実質的に見つけられないに等しい、と考えられています。このように、めったにハッシュ値が一致しない性質を『耐衝突性が高い』といいます」(坂本)

実は、かつて主流だったMD5やSHA1は、SHA2に比べてハッシュ値の桁数が少ないため、耐衝突性が低い計算アルゴリズムとなり、今日では事実上使用が推奨されていません。

ハッシュ化と暗号化の違いは?

ハッシュ値は、元データが少しでも異なると、まったく異なる文字列へ変換されます。これにより、”暗号”としての役割を担うことができます。身近なところでは、ECサイトなどにログインする際にID(アカウント)と組み合わせて使用するパスワードを、ハッシュ値に変換してからECサイト側のデータベースで保管する、というものです。

注意していただきたいのは、ハッシュ化は「暗号化」とは厳密には異なること、です。暗号は、元データの暗号化や復号化に用いる鍵(キー)を入手できれば、元データへ戻すこと(復号化)が可能です。一方、ハッシュ値はハッシュ化の際に元データの情報を欠落させてしまう処理などがあり、特徴に記したように元データに戻すことはできません。

「ハッシュ値は、暗号ではありません。それでも万一、パスワードがサーバーの外部に流出した場合でも解読が困難なのでセキュリティレベルが大幅に強化されます。ハッシュ化されていない平文(ひらぶん)の場合は、盗み取ったIDとパスワードをそのまま入力して本人になりすまし、ECサイトなどにログインできるかもしれません。しかし、IDとハッシュ値の組み合わせでは、(平文ではないので)そもそもログインすることができません。そしてハッシュ値から平文のパスワードへの逆変換は、前述の一方向性ゆえに困難です」(坂本)

とはいえ元データとそのハッシュ値の組み合わせを知っていれば、ハッシュ値から元データを見つけることができます。

「実は、既知のパスワードとそのハッシュ値のリストがインターネット上に存在することが知られています。仮になんらかのパスワードをハッシュ化したとしても、そのリストに掲載されていたならば、元データがバレバレです。その脅威を回避し、暗号としてのハッシュの役割を強化する手法が、ソルト(salt)です」(宮崎)

ソルトとは、ハッシュ化する前の元データに、ランダムな文字列を付加(味付け)してからハッシュ化する、という手法です。ソルトを知られなければ、ソルト化されたハッシュ値の解読は極めて難しくなります。

こうした暗号的役割を果たすハッシュは、分散台帳技術や電子署名、公開鍵認証基盤(PKI)、タイムスタンプなどと組み合わされることで、いわゆる「ブロックチェーン」を支える要素技術として今日、不可欠になっています。

お問合せ