以下色々意訳しているので原文の正確性を損ねている個所があります。(個人メモなので許容かと)
ハッシュ関数とは
ハッシュ関数とは「任意の長さの入力値を固定長の出力へと変換するアルゴリズム」のこと。ハッシュ関数で生成したデータをハッシュ値と呼びます。
ところでハッシュ関数でも暗号化に適するもの・適さないものがあります。適するハッシュ関数の特性には以下があります。
一方向性(原像計算困難性)
ハッシュ値から、その元となるデータを見つけたり再計算したりすることが困難なこと
第二原像計算困難性
ある元のデータとハッシュ値から、同じハッシュ値になる別なデータ(のならび)を見つけることが困難であること
衝突耐性
同じハッシュ値となる元データ(のならび)を2つ見つけることが計算困難であること
代表的な(暗号化用の)ハッシュ関数
原文の執筆時点(2023年)では
・SHA2
・SHA3
暗号化用には推奨されないハッシュ関数(2023年時点)
暗号化の強度が弱いため推奨されないもの
・SHA1
・MD5
ハッシュ関数の暗号化の強度は(暗号化アルゴリズム(前記事のストリーム暗号化方式とブロック暗号化方式, その他?)とは異なり)、ハッシュ値の長さと同一(比例)するものではありません。
ハッシュ関数の強度は暗号化アルゴリズムの半分程度しかない、とされているようです。(原書では、誕生日のパラドクス という問題からの導出)
おまけ:IBM i のハッシュ関数
IBM i 7.4でハッシュ関数 HASH が追加されました。
※IBM i 7.3以前にも HASH 関数はあったのですが、7.3以前のHASH 関数は当記事にあるハッシュ関数とは全く異なる関数のため、IBM i 7.4以降では HASH_VALUES に名称変更されました。
IBM i でサポートされるハッシュ関数は以下です(IBM i 7.6 TR1レベル)
IBM i ではHASH関数はスカラー関数の1つに分類されています。
参考:組込み関数 > スカラー関数 > HASH関数 IBM i 7.6
| 機能名 | ハッシュ・アルゴリズム | 結果のサイズ | 戻り値の数 | 結果の長さ | ハッシュ関数で使用される対応アルゴリズム値 |
|---|---|---|---|---|---|
| HASH_MD5 | MD5 | 128ビット | 2の128乗 | 16 | 0 |
| HASH_SHA1 | SHA1 | 160ビット | 2の160乗 | 20 | 1 |
| HASH_SHA256 | SHA-256 | 256ビット | 2の256乗 | 32 | 2 |
| HASH_SHA512 | SHA-512 | 512ビット | 2の512乗 | 64 | 3 |
IBM i ハッシュ関数の使用例
MD5の例
VALUES HEX(HASH_MD5('HELLO WORLD.'));
SHA256の例
VALUES HEX(HASH_SHA256('HELLO WORLD.'));
SHA512の例
VALUES HEX(HASH_SHA512('HELLO WORLD.'));
暗号鍵:ハッシュ鍵の必要性
ハッシュ関数を使って暗号化した場合、データの受信側ではハッシュ値を持っていないとデータを戻せません。暗号化されたデータとハッシュ値を同時に送付すると、攻撃者Malloryマロリーはデータとハッシュ値の両方を改ざんして受信者に送り付けることも理論上は可能になってしまいます。
ということで、ハッシュ鍵というハッシュ専用の暗号鍵を作り、送信者・受信者で共有しておく方法が生まれました。この方法であればArisアリスから送信されたデータを、攻撃者マロリーが途中でデータを改ざんした場合、受信者Bobボブはハッシュ鍵を使って改ざんされているかを確認できます。
このような原理でハッシュ関数を拡張して認証を可能とした関数(暗号化鍵を使ったハッシュ関数)をMAC(Message Authentication Code メッセージ認証コード)、または鍵付きハッシュ(Keyed-hash)と呼びます。
MACは後述のデジタル署名の一種ともいえる。
さらに ハッシュ鍵を安全に送信メッセージに織り交ぜる仕組みをHMAC(Hash-based Message Authentication Code) と呼びます。
暗号化利用モード
暗号化利用モードとは、ブロック暗号化方式を拡張して任意の長さのデータを暗号化できるようにする処理を指します。
基本的には気密性の向上を目的とし、認証を組み合わせるものもある(GCMなど)。ストリーム暗号化方式にも使用可能な暗号化利用モードもあります。
暗号化利用モードは、ECB, CBC, CFB, OFB, CTR, GCM など様々なモードがあります。
原著では既に安全とされていないモードとしてECB、TLS1.3より前のTLSで一般的な例としてCBCを挙げています。
ECB Electronic Code Book モード
ECBはブロック長の整数倍の長さのデータを暗号化できます。(ブロック長に満たない端数は整数倍になるようにパディングを追加する。)暗号化はデータをブロック長で分割し、ブロック単位で暗号化します。
ECBの欠点として決定論的=入力が同じなら結果も同一なため、暗号文に一定のパターンが現出する、攻撃者はそのパターンを容易に発見できてしまう、暗号化した通信を繰り返し観察することで暗号化のロジックを何度も試すことが出来てしまう、という事を挙げています。
このようなECBの脆弱性を突いた攻撃にBEAST攻撃がありました。
CBC Cipher Block Chaining モード
CBCはECBを改良したもので、ECBの決定論的、という弱点を補うものとしてIV(Initialization Vector 初期化ブロック)という概念が導入されています。IVにより入力メッセージブロックが同一でも異なる出力を生成できます。
CBCは、
1). まずランダムな=予測不能な IVを生成する。IVの長さはブロック長と同一にする
2). IVと暗号化したいデータの最初のブロックの排他的論理和を生成する。この結果、元データの第1番目のブロックが暗号化される
3). 2番目のブロックを暗号化する際、第1番目のブロック(暗号化されたデータ)をIVとして使用し、排他的論理和を生成し暗号化する。
4). 以下同様に、3番目のブロックを暗号化する際は2番目のブロック(暗号化済み)をIVとして排他的論理和を生成し暗号化する、4番目のブロックでは3番目のブロック(暗号化済み)をIVとして、、とチェーンしていく。(CBC の名前の由来)
CBCは1番目のブロックで使用するランダム生成されたIVを受信側に送付する事が重要です。


