SHA-256の概要
ブロックチェーンにおいてはハッシュ関数と呼ばれる関数が様々な場面で使用されます。
ハッシュ関数とは、以下の特徴的な性質を持つ関数です。
- 任意の長さのデータから固定長の出力データを返す
- あるデータを一方向にしか変換できず、ハッシュ化されたデータを元のデータに戻すことは基本的に不可能
SHA-256は、このハッシュ関数の一つになります。
SHA-256は「Secure Hash Algorithm 256-bit」の略であり、その名前が示す通り256ビット(32バイト)長のハッシュ値を得ることができます。 ハッシュ関数の性質通り、同じデータからは必ず同じ値が得られるようになっています。一方、少しでも異なるデータからは、まったく違う値が得られるようにもなっています。また、いわゆる暗号学的ハッシュ関数として設計されており、あるデータを元に、同じハッシュ値になる別のデータを効率よく探索することは困難なようになっています。
SHA-256のアルゴリズム
SHAのアルゴリズムでは、初期のハッシュ値が決まっており、この初期ハッシュを変化させるために使われる情報が入力データです。 SHA-256の場合、入力データは64バイトごとに分割されます。 分割されたデータは「メッセージブロック」と名づけられています。 入力データの量が64バイトを超える場合は、複数のメッセージブロックが形成されることになります。
次に、初期ハッシュを最初のメッセージブロックを使って変化させ、新しいハッシュ値を算出します。 さらに、そのハッシュ値を次のメッセージブロックで変化させて新しいハッシュ値を得て、さらに次のメッセージブロックで…という具合に処理されていきます。 そして最後のメッセージブロックで算出されたハッシュ値が最終結果になります。
このように64バイトに分割した入力データを使ってハッシュ値を変化させていくことで、入力データ量に関係なく同じビット長の値が得られるようになっているのです。
SHA-2規格
SHA-256はNSA(米国家安全保障局)が考案し、2001年にNIST(米国標準技術局)によって連邦情報処理標準の一つ(FIPS 180-4)として標準化された「SHA-2」規格の一部として定義されています。SHA-2では他にハッシュ値の長さが224ビットのSHA-224、384ビットのSHA-384、512ビットのSHA-512などが定義されています。
ハッシュ値のアルゴリズムを考える上で重要なのが「ハッシュ衝突」と呼ばれる現象です。これは異なるデータから同じハッシュ値が生成されてしまう事態を指します。 元のデータがどんな長さであっても、生成される値のビット長が決められている以上、絶対に衝突のないハッシュ関数は有り得ません。 従って、ハッシュ値のビット長が長ければ長いほどハッシュ衝突は起こりにくくなります。
ハッシュ衝突の回避率はビット数が1増えただけで2倍になるので、256ビット長のハッシュ値は、128ビット長のハッシュ値より2を128回かけた分だけ、ハッシュ衝突の回避率が上がることなります。逆に、ハッシュ衝突するデータを見つけるにはかなりの時間がかかることとなり、元データの割り出しは現在ではほぼ不可能とされています。よって512ビット長の方が高いハッシュ強度を得られますが、SHA-512は64ビットCPU向けに最適化されたアルゴリズムであるので、32ビットCPU向けに最適化されたSHA-256とはCPUの演算系が異なります。
一般的には、最長のSHA-512が最も安全性が高く、一方でSHA-256は実装のしやすさや計算速度、暗号学的な安全性のバランスに優れ、最も広く普及していると言われています。
SHA-256が使われているサービス
ビットコインではSHA-256とRIPEMD-160の2つのハッシュ関数が使われています。これらのハッシュはGPUや計算専用のハードウェアであるASIC(Application Specific Integrated Circuit)で計算するのに向いています。これに対し、他のブロックチェーンでは普通のPCでもマイニングしやすいように、GPUやASICでは計算しづらいよう工夫されたハッシュアルゴリズムを使っているものも多く存在しています。
SHA-256は当初はCPUで計算を行ってましたが、GPUを使って並列に計算するGPUマイニングに移行し、続いてFPGA(Field-Programmable Gate Arra)でこの計算を行うFPGAマイニングが主流になりました。しかし、この論理を実行するASICを作れば、消費電力が少なく、高速で演算ができることから、現在では専用のASICを使うASICマイニングが主流となっています。
また、WebブラウザとWebサーバ間でSSL(Secure Socket Layer)暗号化通信を行うための電子証明書であるSSLサーバー証明書もハッシュ関数を使用しています。数年前までは、SHA-1と呼ばれるハッシュ関数がよく使われていましtが、現在はSHA-2が主流になっています。
SHA1からSHA2への移行
SHA-2の前規格であるSHA-1は160ビット(20バイト)のハッシュ値を生成するハッシュ関数であり、多くのアプリケーションやプロトコルに採用されていました。しかし、SHA-1はその脆弱性・危険性が見つかり、懸念されていたにも関わらず世の中のほとんどのWebサイトで使用され続けていました。この状況に対してNISTは、広く暗号化に使用されてきたSHA-1に関して2010年までにSHA-2への移行勧告を出しましたが、SHA-2の普及は広まらず、SHA-1に関しては「非推奨」という表現に留まっていました。
ところが、2013年にMicrosoftがSHA-1ハッシュ関数を使用したSSLサーバー証明書に関して、2017年以降使用不可にするSHA-1廃止ポリシーの発表を出したことを皮切りに、GoogleやmozillaもSHA-1使用に対して同様に廃止ポリシーが発表され、IEやChromeなどのブラウザでSHA1の。現在はSHA-1からSHA-2への移行され、SHA-2が世界標準となっています。
このように、ビットコインのみにとどまらず様々な暗号技術分野においてSHA-256は利用されています。現在はSHA-256の規格であるSHA-2へまさに移行の最中であることから、絶対に抑えておきたい、技術の1つと言えるでしょう。
参考情報
- FAQ: SHA-1 廃止/SHA-2 移行に関するマイクロソフトのポリシー (マイクロソフト社)
- An update on SHA-1 certificates in Chrome (グーグル社)
- Continuing to Phase Out SHA-1 Certificates (Mozilla)