Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解PHP crypt()返回值_Php_Hash_Crypt_Oneway - Fatal编程技术网

理解PHP crypt()返回值

理解PHP crypt()返回值,php,hash,crypt,oneway,Php,Hash,Crypt,Oneway,据说PHP具有以下返回值: "Returns the hashed string or a string that is shorter than 13 characters and is guaranteed to differ from the salt on failure." 我不明白这意味着什么。。。我基本上理解了这个函数是如何工作的,但我想知道如何解释返回值,并试图理解这种情况何时发生。。这是PHP手册中迄今为止较为模糊的解释之一,或者可能我只是因为太长时间盯着它看而失明…?:)

据说PHP具有以下返回值:

"Returns the hashed string or a string that is shorter than 13 characters and is 
guaranteed to differ from the salt on failure."
我不明白这意味着什么。。。我基本上理解了这个函数是如何工作的,但我想知道如何解释返回值,并试图理解这种情况何时发生。。这是PHP手册中迄今为止较为模糊的解释之一,或者可能我只是因为太长时间盯着它看而失明…?:)

其中提到的一件事:

(5.3.2)修复了无效轮上的河豚行为,以返回“失败”字符串(“*0”或“*1”),而不是返回DES

显然,
crypt
在失败时可以返回不同的[指定不当的]短字符串。我怀疑“或”位是为了解释“不同于盐”

以这种方式,字符串“少于13个字符”(谁知道是什么)->失败。唯一记录在案的案例与无效的河豚选项有关,但可能在未来扩大。(虽然不在文档中,但表示当salt无效时,应为算法返回“失败”。)


盐永远不会被退回的原因可能与:

如果使用MD5 salt执行crypt(),则返回值仅列示salt

结果是
$valid=crypt($pw,$crypt)都为TRUE

因此,通过确保salt本身不被返回,它避免了一个反馈循环,在这个循环中,存储的散列(由于bug而产生的salt)将始终注册为对任何密码都有效。不返回salt的限制可能会缓解不同(已修补和未修补?)服务器之间的退化交互



还有,有人知道如何找到特定PHP版本的point文档吗?看到“与salt不同”子句是何时添加的将是一件有趣的事情。

不知道它有多重要,但是
crypt
在您错误地调用它时当然会失败——即:当
$str
(或
$salt
,如果提供)不能合法地转换为字符串时。例如,如果您传递的数组、资源或类的实例没有定义
\uuu toString()
函数。但在我的机器上,这会导致
crypt
返回
null
,而不是字符串。明白了。。。好吧,尽管它可能会传递一个短字符串作为失败的信号。。我感兴趣的是找出他们为什么要说它不同于失败的盐……好吧。。所以短字符串->失败。。但其余的。。。“并保证在失败时与salt不同”…好吧,如果它失败了,我们会收到短字符串,它也保证与salt不同?为什么这些信息很重要?“我不明白为什么我想知道…?”快速反应我更新了我的答案,只找到了一些合理的解释。也就是说,我相信修复一个bug只是一种简单的黑客行为,而整个cryptapi正在降级为一团混乱,以支持当前的使用。究竟是谁检查crypt的返回值?为什么它不在关键故障时抛出异常?我想至少,如果盐不归还,用户将永远无法登录,必须有人[快速]解决这个问题。谢谢,很好的解释!基本上,在将生成的密码插入数据库之前,应该检查crypt()的结果并确认其长度为13个字符或更长,然后。。。不知道它什么时候会失败,当给它含有非法字符的盐时,它似乎会失败。。。不知道实际密码中的字符是否有限制?