ハッシュ値 ハッシュ関数



ソフトウェア

公開日:2021/5/22 , 最終更新日:2021/7/4         

前提知識、関連知識
 ・チェックサムエラーとは
 ・暗号化の仕組み


■ハッシュ関数とは
ハッシュ関数とは、入力データを所定のアルゴリズムに従って、一見ランダムに見える所定長のデータに変換する関数です。 ハッシュ関数によって出力されたデータをハッシュ値といいます。

 

<ハッシュ関数の用途>
① 長さが異なる文字列を一律に固定長の信号に変換するので、情報が扱いやすくなる。例えばメッセージ検索をハッシュ値で検索した方が効率が良い。

② 通信相手とデータのやり取りをする過程で発生したデータエラー(電気的ノイズ等によって発生)を検知することができる。例えば、送信側でメッセージとハッシュ値を送り、受信側で作成したハッシュ値を比較することで、データに誤りがないかを防ぐことが出来ます。 これはチェックサムエラー等と目的が同じです。

 

なおハッシュ値はデータの改ざんを防ぐには弱いです。なぜなら、データとハッシュ値の関係性が正しいことを証明するだけなので、データとハッシュ値両方を改ざんした場合、それを見抜くことはできません。 それならばハッシュ関数を送受信側の両者にしか分からないユニークなものを設定すればよいと思いますが、その考え方を用いたのが暗号化技術です。ただし、関数自体をユニークにするのではなく、関数に入れるパラメータをユニークにします。

<ハッシュ関数の種類>
MD5(Message Digest 5)
128ビットの値を生成するハッシュ関数。これまで広く使われてきた関数であるが、現在では安全性は高くないということから、使われなくなってきている。

SHA-1(Secure Hash Algorighm)
160ビットのハッシュ値を生成します。MD5より安全性が高い。

SHA-2
SHA-1の後継。SHA-224、SHA-256、SHA-384、SHA-512があり、それぞれ224ビット、256ビット、384ビット、512ビットのハッシュ値を生成します。

<ハッシュ値から元の信号は復元できない>
暗号値とは異なり、ハッシュ値は元の信号を復元できません。その理由を簡単に説明します。 例えば、入力値に対して5で割り続けた時の余りを4桁分だけ表示するというアルゴリズムを持つハッシュ関数があったとします。 すると以下の様に、異なる入力値(この場合136と761)でも同じハッシュ値を持つ場合があります。これは余りを4桁分しか表示しないことで、761の方は情報を圧縮していることを意味します。 つまり、ハッシュ値からは入力値を特定することが出来ないことを意味します。

 

暗号値は元のデータを復元できるので、ハッシュ値を使わずそちらを使えばよいかと思うかもしれませんが、ハッシュ値の方が計算が早く扱いが容易なので、目的に応じて使い分けます。

■pythonによる実例
pythonでハッシュ関数を使って、ハッシュ値を求めてみます。

import hashlib # ハッシュ関数をインポートする

data = 'おはよう'
aa = hashlib.md5(data.encode()).hexdigest() # md5を使う。
print(aa)

 ⇒ 896c87c2017e74cf8c7ccf42d339ca66 # 16進数で出力


他のハッシュ関数を使いたい場合は、md5のところを、sha224、sha256、sha512などに変えればよいです。










サブチャンネルあります。⇒ 何かのお役に立てればと

関連記事一覧



ソフトウェア