-1

我正在阅读此页面中作者生成随机令牌的代码。我理解除了“第 29 行”之外的所有内容,他将令牌分成块并用 md5 散列它们。我的问题是:

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 的编辑,第三个参数 (32) 设置返回字符串的长度。我建议你仔细阅读 PHP 手册。这是一个很好的资源。

于 2013-01-16T19:17:22.017 回答
1
  1. 代码(可能)需要生成一个长度超过 32 个字符的令牌。
  2. 因为 md5() 返回一个 32 个字符的字符串,并且他需要一次建立所需的令牌长度 32 个字符。
于 2013-01-16T19:23:06.563 回答