一个小代码片段解释

时间:2013-01-16 19:14:21

标签: php

我正在阅读作者正在生成随机令牌的page中的代码。我理解除“第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?

2 个答案:

答案 0 :(得分:5)

md5()是一种单向散列算法。意思是它无法重建成原始形式。

要回答问题1,它会创建一个更安全的哈希。公共字符串可以与其已知的哈希值匹配。这有助于防止这种情况发生。

2)不会。每次拆分都会给你一个不同的结果,在这种情况下,这样可以使它更安全。

编号为4,第三个参数(32)设置返回字符串的长度。我建议你看一下PHP手册。这是一个很好的资源。

答案 1 :(得分:1)

  1. 代码(可能)需要生成超过32个字符的令牌。
  2. 没有
  3. 没有
  4. 因为md5()返回一个32个字符的字符串,他需要一次建立所需的令牌长度为32个字符。