web-dev-qa-db-ja.com

この例では、パスワードでハッシュする前に、ランダムに生成されたソルトをハッシュするのはなぜですか?

here から、コードreturn substr(sha1(mt_Rand()),0,22);でsha1値を​​取得する意味は何ですか?パスワードに追加され、Blowfishを使用してハッシュされます。ランダムに生成された番号を追加しないのはなぜですか?

class PassHash {  
    // blowfish  
    private static $algo = '$2a';  
    // cost parameter  
    private static $cost = '$10';  
    // mainly for internal use  
    public static function unique_salt() {  
        return substr(sha1(mt_Rand()),0,22);  
    }  
    // this will be used to generate a hash  
    public static function hash($password) {  
        return crypt($password,  
                    self::$algo .  
                    self::$cost .  
                    '$' . self::unique_salt());  
    }  
    // this will be used to compare a password against a hash  
    public static function check_password($hash, $password) {  
        $full_salt = substr($hash, 0, 29);  
        $new_hash = crypt($password, $full_salt);  
        return ($hash == $new_hash);  
    }  
}  
2
Celeritas

彼らは不安とシャーマニズムの混合からこのハッシュを行います。

ハッシュは実際のセキュリティには価値がありません。 mt_Rand()は一意性を保証するのに十分ではないため、それらの塩漬けはbadです(良い塩は一意になるように努力する必要があり、ランダムな塩は高い確率で一意の値を取得するための良い方法ですが、十分に大きいスペースで、goodランダムジェネレーターを使用する必要があります値の;および mt_Rand() 両方で失敗します)。 mt_Rand()の出力をSHA-1でハッシュすると、印象に、ソルトが実際よりもランダムであるという印象が与えられます。開発者は、人間の目には「ランダムに見える」ので、物事がより安全であるという温かいあいまいな感覚を持っている必要があります。

また、特定のコードにハッシュ関数の呼び出しを振りかけることは、Spirits ofCryptographyを促進する方法です。暗号神はそれらを頻繁に使用する人(または非常に多くの開発者が信じているようです)を好意的に見ることはよく知られています。

6
Thomas Pornin

(CodesInChaosからのフィードバックを組み込むために拡張されました)

あなたの質問である「なぜ」に答えるために、すなわち、塩生成の一般的な場合:

塩は通常目に見えます、それは秘密ではありません。ランダム値mightを使用するだけで、乱数ジェネレーターの内部状態情報が明らかになります。一方向ハッシュ関数はそれを隠します。

これは、暗号的に安全なPRNGの代替としては不十分です。このようなPRNGは、内部で1つ以上の暗号的に安全なハッシュを使用します。

この特定のケースでは、PHPのmt_Rand()(31ビット)のエントロピー出力が低いため、値が追加されず、最悪の場合、誤解を招く可能性があります。参照 https://stackoverflow.com/questions/6618836/how-if-at-all-does-a-predictable-random-number-generator-get-more-secure-after

0
mr.spuratic