-1

作成者がランダムトークンを生成しているこのページのコードを読んでいます。彼がトークンをチャンクに分割し、それらをmd5でハッシュする「29行目」以外はすべて理解しています。私の質問は::

1) トークン全体をハッシュせず、分割してチャンクにハッシュしたのはなぜですか?

2) それらをチャンクでハッシュすると、分割されていないトークンをハッシュするのと同じ結果が得られますか?

3)「36行目」でも 、文字数を減らすことができると思われる部分文字列を実行しています。そうすることで、ハッシュされたトークンを元のハッシュされていないトークンに再構築できますか?

コードの最も重要な部分は次のとおりです::

# Array indice friendly number of chars; empty token string
    $numChars = count($chars) - 1; $token = '';

    # Create random token at the specified length
    for ( $i=0; $i<$len; $i++ )
        $token .= $chars[ mt_rand(0, $numChars) ];

    # Should token be run through md5?
    if ( $md5 ) {

        # Number of 32 char chunks
        $chunks = ceil( strlen($token) / 32 ); $md5token = '';

        # Run each chunk through md5
        for ( $i=1; $i<=$chunks; $i++ )
            $md5token .= md5( substr($token, $i * 32 - 32, 32) );

        # Trim the token
        $token = substr($md5token, 0, $len);

    } return $token;
}

誰かが私を少し理解するのを手伝ってくれることを願っています。ありがとう

編集

4) なぜ彼は substr() 関数内で 32 を使用したのですか?

4

2 に答える 2

5

md5()一方向ハッシュアルゴリズムです。つまり、元の形式に再構築することはできません。

質問1に答えるために、より安全なハッシュを作成します。一般的な文字列は、既知のハッシュ値と一致させることができます。これは、それが起こらないようにするのに役立ちます。

2)いいえ。分割ごとに異なる結果が得られます。この場合は、より安全にすることを目的としています。

そして、番号4の編集、3番目のパラメーター(32)は、返される文字列の長さを設定します。PHPのマニュアルを一読することをお勧めします。それは素晴らしいリソースです。

于 2013-01-16T19:17:22.017 に答える
1
  1. コードは (場合によっては) 32 文字を超えるトークンを生成する必要があります。
  2. 番号
  3. 番号
  4. md5() は 32 文字の文字列を返し、一度に 32 文字の必要なトークン長を構築する必要があるためです。
于 2013-01-16T19:23:06.563 に答える