叡智の三猿

〜森羅万象を情報セキュリティで捉える

当サイトは、アフィリエイト広告を使用しています。

ハッシュとn進数

前回のブログではブロックチェーンの要となるハッシュ関数について書きました。今回は少しその補足をしたいと思います。
www.three-wise-monkeys.com

n進法について

ハッシュ関数により求められたハッシュ値(メッセージダイジェストともいいます)は、16進数で表記されます。

コンピュータの世界は、わたし達が日常で使っている数字(10進数)だけでなく、2進数や16進数が登場します。

実際にはコンピュータの仕事をするにあたって、2進数や16進数を深く理解していなくとも、大きな支障は無いと思います。ただ、IPAが行なっている「基本情報処理技術者試験」では、n進法の理解が必須です。特に数学を余り学んで来なかった文科系出身のITエンジニアは、n進法の理解が試験に合格するためのネックになっているとよく聞きます。

ですので、エンジニアであれば10進数を基準として、16進数、2進数への変換、およびその逆変換の方法を知っておく意味はあると思います。

とっときにくいのですが、慣れれば大丈夫だと思います。

ちなみに、令和2年度から、基本情報技術者試験はCBT(Computer Based Testing)方式での実施となっています。興味のある方はIPAの案内を参照してください。
www.jitec.ipa.go.jp

10進数から2進数へ

10進数を2進数に変換するには、変換したい10進数を2で割れるところまで割りつづけます。 これで求めた余りの部分が2進数への変換結果となります。

10進数から16進数へ

10進数を16進数へ変換するには、変換したい10進数を16で割れるところまで割りつづけます。これで求めた余りの部分が16進数への変換結果となります。ただし、余りの部分の数字が10から15であった場合は、黒板に書いた変換表を使って表記を変換します。

2進数から10進数へ

2進数を10進数に変換するには、変換したい2進数の各位の値にその位の2n-1を掛けて、すべての桁について足し合わせます。

16進数から10進数へ

16進数を10進数に変換するには、変換したい16進数の各位の値にその位の16n-1を掛けて、すべての桁について足し合わせます。但し、変換したい16進数の値がアルファベットの場合は、10進数から16進数に変換する場合と同じく、変換表を使って表記を変換します。

パスワードの保管に使うハッシュ値

元の値をハッシュ関数にハッシュ化された値から、元のデータに復元することが出来ません。ハッシュ関数は一方向性関数といわれます。このハッシュ関数の特性は、パスワードを補完するのに効果的です。

たとえば、システムの利用者が自分のログインパスワードを”1234567”という、シンプルなものにしたとします。この値をそのままデータベースのテーブルに保管すると、第三者がそのデータベースを参照することで、容易にパスワードを分かってしまいます。

そこでパスワードをハッシュ関数によりハッシュ化して保管することで、第三者にパスワードを見破られないようにします。

MD5であれば”1234567”というパスワードはつぎのハッシュ値に変換されます。

  • FCEA920F7412B5DA7BE0CF42B8C93759

このようなパスワードを平文でなく、ハッシュ値で保存することでシステムの安全性は高くなります。

ただ、セキュリティへの攻撃も進化しています。いまは、同一のハッシュ値を持つ異なる原文のペアを効率よく探索することができるようになっています。そのため、セキュリティを目的としてMD5を使うのは安全ではありません。

安全なハッシュ関数を確認するためのガイドラインがCRYPTREC暗号リスト(電子政府推奨暗号リスト)です。これは、総務省及び経済産業省が共同で開催する暗号技術検討会等において、暗号を公募の上、客観的に評価したものです。

CRYPTREC暗号リストによる「電子政府推奨暗号リスト」で推奨されているハッシュ関数は以下の通りです。

  • SHAー256
  • SHAー384
  • SHAー512

電子政府推奨暗号リストとは

  • CRYPTRECにより安全性及び実装性能が確認された暗号技術について、市場における利用実績が十分であるか今後の普及が見込まれると判断され、当該技術の利用を推奨するもののリストです。