Pythonで作るブロックチェーン所感 その3 ハッシュの話

引き続きこの記事を参考にしながら、ブロックチェーンを作りつつ、色々周辺事情を調べて行きたいと思います。

ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin

bitFlyer ビットコインを始めるなら安心・安全な取引所で

 

Hash

まずハッシュの話をします。

 

ハッシュとは

ハッシュとは任意のデータを変換して得られる固定長のデータのことです。

よくわかりませんね。
あとで具体例を挙げるのでもう少し辛抱してください。

 

ハッシュ関数とは

あるデータをハッシュ化するために用いる関数のことです。
これはデタラメな値を返却しているわけではなく、複雑なアルゴリズムを通して算出されます。
ですので、同じ値を入れると必ず同じ値が返却されるようになっています。

また、ハッシュ関数は一方向にしか変換することができず、元に戻すことは実質不可能です。
詳しくは後述しますが、元のデータが一文字でも変わると、返却される値は全く異なるものになります。
なので、予測するのも不可能なのです。

 

ハッシュ衝突とは

ハッシュ衝突とは異なる元のデータから、同じハッシュ値が生成されてしまうことです。
元のデータは任意の長さなので、あるデータとあるデータは同じハッシュ値が生成されてしまうことも稀にあります。
ハッシュ衝突の確率はハッシュ値のビット長に依存します。
単純計算で256ビット長のハッシュ値は、128ビット長のハッシュ値より2^128倍ハッシュ衝突の回避率が高まることがわかります。

 

ハッシュの何が嬉しいの?

利用用途はいくつかあるようです。

 

誤り検出

その昔、通信速度がめちゃくちゃ遅く、エラーも起きやすかった時代に
データが通信中にバグによって途中で変わってしまうことがありました。

そこで、送信者はデータと一緒にハッシュ値を暗号化したものをデータと一緒に送付します。
このように認証のためにハッシュ値を暗号化したものを「署名」と言います。
受信者は受け取ったデータをハッシュ関数にかけ、ハッシュ値を計算します。
その出力が送付されたハッシュ値と一致していたらデータが無事に送信された事を確認できますね。

ちなみにGitのコミットIDもハッシュの一種(SHA-1)が使われています。

 

暗号化

Webサービスのログインパスワードなどをハッシュによって暗号化してデータベースに保存したりします。
これによってデータベースのデータが漏洩しても何の参考にもならないので安全であると言えます。

キャッシュ

低速な記憶媒体に格納されたデータセットのためのキャッシュとしても利用されます。
これのおかげで素早く前回のデータを返却することができます。

もしハッシュ衝突しても、古い方を消去すればいいのでハッシュ衝突に懸念がありません。

 

Bitcoinで使われているハッシュ関数

SHA256とRIPEMD160というのが使われているようです。

 

SHA256

任意の長さのデータから固定長の値を算出するのが特徴です。
どんな長さのデータからも256bit、つまり64文字のハッシュ値を算出できます。
計算速度、暗号学的な安全性のバランスに優れています。

 

RIPEMD160

こちらはオープンなコミュニティで開発されているRIPEMDの内の一つです。
160bitのハッシュ値を返します。
Bitcoinの他にはOpenSSLなどにも使われています。

 

ダブルハッシュ

ダブルハッシュというのは何らかのデータをハッシュしたものを再びハッシュすることです。
ハッシュ関数の組み合わせを変えたりすることで、より予測しづらいハッシュ値を算出できます。

【参考】https://www.otsuka-shokai.co.jp/words/hash.html

 

Pythonでハッシュを使ってみる

せっかくなのでpythonで簡単に使ってみます。

 

【参考】http://docs.python.jp/3.6/library/hashlib.html

 

本題

さて、前置きが大分長くなってしまいましたが、ここからが本題です。
hashメソッドを作っています。

ちなみにjson.dump()というのはJSON形式に変換するためのメソッドです。

Binance

コメントを残す