我正在阅读作者正在生成随机令牌的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?
答案 0 :(得分:5)
md5()
是一种单向散列算法。意思是它无法重建成原始形式。
要回答问题1,它会创建一个更安全的哈希。公共字符串可以与其已知的哈希值匹配。这有助于防止这种情况发生。
2)不会。每次拆分都会给你一个不同的结果,在这种情况下,这样可以使它更安全。
编号为4,第三个参数(32)设置返回字符串的长度。我建议你看一下PHP手册。这是一个很好的资源。
答案 1 :(得分:1)