質問: String.format("%02x", b); str.append(hex); } ``` 上記のソースなのですが、 ユニークでランダムな値を作成するのに使用しているメソッドとの事なのですが、 特に1~3の部分の処理がいまいちわからないです。 1については調べてみてもよくわからず、 ランダムな値を返してるのかな?といったレベルの認識です。 2でハッシュ値を作成して、3でさらに1で取得した値を付け加えて ハッシュ値を更新しているという認識でいいのでしょうか? そしてこれは100%ユニークな値になるのでしょうか? ご教授よろしくお願いいたします。 またここの説明間違ってるよって部分があったら、 指摘をお願いいたします。
回答: ハッシュ関数とともに利用するSALT値の目的は、ハッシュ化するデータ(文字列)に "特定のルールで出力したSALTをつけてから" ハッシュ関数を通すことで、元の文字列を特定できにくくするためのものです。 ですので闇雲にランダムな値を出力だとハッシュ化した後に照合できなくなります。 ハッシュ化対象の文字列を target 、SALT値を salt とすると、行コメントされたところでの処理は... 1. 普通は、target+salt を生成します。(引数に何も指定していないのは不思議ですが...。何らかの別のルールと値で照合しているなら引数なしもありえます) 2. ハッシュ関数にSHA-256を採用する。 3. 1の文字列( target+salt )をSHA-256でハッシュ化する あとで照合をするときは、実行プログラム側がsaltを生成するルールを知っているので、チェック対象の文字列を check とすれば、check+slatで同じようにハッシュ関数にかけると、同じハッシュ値になります。 JavaでBCryptを扱っているフレームワークはSpringSecurityがあります。こちらはSALT生成→ハッシュ関数の実行→ハッシュ化した値が返される一連の流れを一発で実現しています。 なお、ハッシュ関数が衝突する確率はほぼ0ですが、文字列が短い場合や試行回数が多くなればなるほど衝突可能性は高まります。