#48 ブロックチェーンの学びはハッシュ関数の体感から始めよう
ブロックチェーンを学びたい。概念的なことはわかったけど、体に染みついていない人は多い。だからいつまでもイマイチわかった気がしない。
現場のエンジニアでない限りたいていそうなってしまいます。
まずハッシュ関数を体験してみましょう。
たとえば分厚い契約書を一冊ハッシュ化するとします。
そうすると256ビット(※いろいろあります)の固定長の英数字が出てきます。これをハッシュ値といいます。
何回、やっても同じ英数字並びになること(決定性といいます)
他の文書と同じ並びになることはほとんどない(一様性。そういう稀な事態を「衝突する」といいます)
英数字から元の文書に戻すことはできません(不可逆性)
もし分厚い契約書の最後の一文字を改竄したときは、256ビットが全く違う並びの英数字になります。
不可逆性という性質を使えば、パスワードなどの保護に使えます。
ここでは、PHPのプログラムでパスワードからハッシュ値を生成して活用するところを見てみましょう。
ControllerとModelのコード例です。
<?php
class UsersController extends AppController {
// Formヘルパーを使う
public $helpers = array('Form');
public $components = array('Session', 'Auth');
/**
* 各アクションの直前に必ず実行される
*/
public function beforeFilter() {
// /users/add は認証がかからないようにする
$this->Auth->allow('add');
// パスワードをSHA256でハッシュ化する
Security::setHash('sha256');
}
}
<?php
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
class User extends AppModel {
public function beforeSave($options = array()) {
if (!$this->id) {
$passwordHasher = new SimplePasswordHasher();
$this->data['User']['password'] = $passwordHasher->hash($this->data['User']['password']);
}
return true;
}
}
sha256、 SimplePasswordHasherがありますね。
Model(データベース)を見てみると、パスワードのところにハッシュ値が生成されていることがわかります。
やり取りはハッシュ値を鍵として合うかをチェックすればいいわけです。
これは自分だけ知っているパスワードから一意に決まり、また1文字でも違うパスワードを入れると全然違った英数字が出てきます。
逆に、これらの英数字から元のパスワードを推定することはできません。
このように皆さんもハッシュ関数のお世話になっているのです。
この感覚を忘れないで次の勉強に行きましょう!