ちょっと誤解されすぎなので全部はレスしませんが、前述のハッシュ値はSHA256で求めたものですよ…。
ハッシュ関数自体を独自に作るのではなく、ハッシュ関数の利用方法の話です。>ソルト&ストレッチング
PHPだとこんなコードです。(わざとダサく書いてます)
$salt = $id . 'himitunomojiretsu'; //(ユーザー毎に違う)ソルト
$hash='';
for ($i = 0; $i<1090; $i++) { //ストレッチング
$hash = hash('sha256', $hash . $pwd . $salt);
}
こう「するべき」である理由は、貴方も仰ってる↓の点などです。
ただ辞書攻撃に引っかかるパスワードであればそのハッシュ値の対応リストも同様にあるので弱い・・・・ということになります。
実装コードが漏れた場合、同じコードで元パスワードを推測可能です。
ハッシュ値から元の値を直接求めるのが難しいのであり、適当なパスワードのハッシュ値を求めて保存内容と比較するだけなら難しくはありません。
あとは適当なパスワードを辞書攻撃や総当りで選ぶだけです。
解説は省きます。是非紹介した書籍を手にとってみてください。(^_^;)
衝突困難性に加えて、原像計算困難性とかも網羅した解説、綺麗なサンプルコードが載っています。
##他の方の言うHMACについては詳しく知りません。PHPのリファレンス見る限りはストレッチングとソルトを内包した考えなのかな…?