PHP
【PHP実装例もあるよ】ハッシュの基本とSHA3について
ざわ
公開日:2023/06/30
みなさんこんにちは!ざわです。
初めての投稿となりますのでお手柔らかにお願いします。
1.概要
みなさんはハッシュという言葉をご存知でしょうか。
ハッシュとは、
とある方法(ハッシュアルゴリズム)を用いて一定の長さの文字列に不可逆的に変換することです。
ハッシュ化されたデータ(ハッシュ値)は、
安全なデータのやり取りとか、改ざんの検知などによく利用されていています。
今回は新しいハッシュアルゴリズムであるSHA3の利用が近年進んでいることから、
ハッシュの基本についての再確認と、SHA3の紹介をしたいと思います。
2.ハッシュの利用例について
ハッシュは下記のようなセキュリティ分野などに利用されています。
- 電子証明(データの改竄防止)
- サーバでのパスワード管理
3.なぜハッシュを利用するのか。
なぜそれらの分野にハッシュが用いられているかを説明するにあたって、ハッシュの特徴を確認してみましょう。
3-1.ハッシュ値の特徴
- 不規則な一定の長さの文字列
- 異なるデータから同一のハッシュ値が生成される確率が極めて低い。
- ハッシュ値から元のデータの推測が困難(不可逆的である)
- 同一のデータからは同じハッシュ値が生成される。
3-2.利用例と特徴
電子証明(データの改竄防止)
送信側と受信側のそれぞれにおいて、やり取りしたデータのハッシュ値が同じであれば改ざんされていないことが分かります。
ポイント:
- 異なるデータから同一のハッシュ値が生成される確率が極めて低い。
(補足)通常、ハッシュ値の交換は公開鍵暗号などの安全な方法と組み合わせて実施されます。
サーバのパスワード管理
ログインに必要なパスワードをハッシュ化してデータベースに記録することで、データベースの内容が露呈してもパスワードの流出を防げます。
また、システム管理者にパスワードが露呈しないというメリットもあります。
ハッシュ値からは元のパスワードは分からなくなりますが、照合はハッシュ値同士で行えば問題ありません。
ポイント:
- ハッシュ値から元のデータの推測が困難(不可逆的である)
- 同一のデータからは同じハッシュ値が生成される。
4.ハッシュアルゴリズムの既知の問題
データをハッシュ化する方法をハッシュアルゴリズムと呼び、世の中には様々なハッシュアルゴリズムがあります。
しかし、脆弱性のあるハッシュアルゴリズムを使用すると、同一のハッシュ値が狙って生成されてしまい、改ざんされたデータを本物とみなしてしまうといったことが起こり得ます。
特に、有名な脆弱性を持つSHA1というハッシュアルゴリズムは、同一のハッシュ値を発見する時間を大幅に短くするSHAttered attackという攻撃手段があるので、可能な限り使用を避けるべきです。
オランダ国立研究機関とGoogleによる共同研究によって、実際に同一のハッシュ値を持つ異なるPDFファイルの成功しているようです。
shatterd
こちらの研究成果は面白いのでぜひご覧いただきたいと思います。
5.新しいハッシュアルゴリズムの紹介
現在はSHA2というSHA1を改良したハッシュアルゴリズムがよく使われており、致命的な脆弱性は発見されてはいませんが、今後のコンピュータの性能向上などによってSHA2も破られる日が来るかもしれません。
そこで、今回はSHA3という新しいハッシュアルゴリズムについて紹介したいと思います。
SHA3は、SHA2の後継的な意味合いでSHA3と命名されていますが、内部的なアルゴリズムは全くの別物となっています。
特徴としては、SHA2と同じく出力長が224, 256, 384, 512となるモードがあり、新たに出力長を任意の長さに設定できるSHAKE128, SHAKE256という2つのモードが用意されています。
SHA-3 【Secure Hash Algorithm 3】 Keccak
https://e-words.jp/w/SHA-3.html
SHA3についての最近の動きとしては、2023年3月23日にWindows11にてSHA3をサポートしたと発表しました。OSへの採用によって今後速やかに普及が進んでいきそうですね。
Microsoft、Windows 11で「SHA-3」をサポートへ ~次世代ハッシュ関数の標準規格
https://forest.watch.impress.co.jp/docs/news/1488064.html
6.簡単な実装例
紹介だけだともったいないので、メッセージをSHA3でハッシュ化できるナニカをPHPで作ってみました。
フォームにハッシュしたいメッセージを入力すると、SHA1、SHA2-256、SHA3-256のそれぞれでハッシュした結果を表示します。
動作イメージ
PHPソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php $msg = filter_input(INPUT_GET,"msg"); if(!empty($msg)){ $strHtml = "SHA1: ".hash('sha1',$msg)."<br>"; $strHtml .= "SHA2-256: ".hash('sha256',$msg)."<br>"; $strHtml .= "SHA3-256: ".hash('sha3-256',$msg)."<br>"; } ?> <!DOCTYPE html> <html lang="ja"> <head> <title>hash</title> </head> <body> <div> <form> <input type="text" name="msg"> <input type="submit"> </form> </div> <div> <?=$strHtml?> </div> </body> </html> |
入力が少し変わっただけでも全く違う文字列が出力されることを確認してみてください。
7.まとめ
ハッシュはデータが改ざんされていないことを証明することや、パスワードの管理を安全にするといったセキュリティ目的に使われることが多い。
脆弱性のあるハッシュアルゴリズムを使用した場合、セキュリティが不正に突破されることがある。
SHA2は現時点において致命的な脆弱性は指摘されていないが、後継的なハッシュアルゴリズムであるSHA3の利用も進んでいる。
最後までお読みいただきありがとうございました。
参考資料
shatterd
フィッシング対策協議会 【注意喚起】ハッシュアルゴリズム 「SHA-1」 の衝突攻撃 (SHAtterd) の Web サイトへの影響に関して (2017/03/07)
https://www.antiphishing.jp/news/info/sha1shatterd20170307.html
Canon ハッシュ化と暗号化の違いとは?
https://eset-info.canon-its.jp/malware_info/special/detail/211013.html
IIJ-SECT SHAttered attack (SHA-1コリジョン発見)
https://sect.iij.ad.jp/blog/2017/02/shattered-attack/
SHA-3 【Secure Hash Algorithm 3】 Keccak
https://e-words.jp/w/SHA-3.html
Microsoft、Windows 11で「SHA-3」をサポートへ ~次世代ハッシュ関数の標準規格
https://forest.watch.impress.co.jp/docs/news/1488064.html
ITをわかりやすく解説 PHPでハッシュ値(SHA1/SHA2/SHA3/MD5)を生成する
https://medium-company.com/php-%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5/