PHP在从数据库检索时截断散列密码


PHP truncating hashed password on retrieval from database

我目前有一些麻烦得到一个登录系统的工作,我相信我已经找到了原因,虽然我不知道为什么会发生或具体是什么导致它。

我有一个散列密码存储在数据库中。password列的值为:

18e2acd33fd3ec752c344b463d00238e35b6b77ed65941f69b9eb96471834f1e507d846071768548f8cf125d6c74ce614d477a576657983bb8620bbc49eed7de

现在,当我在PHP中选择并打印这个字段时,像这样:

$query = "SELECT password FROM webusers WHERE username = 'Roy'";
$update = odbc_exec($connect, $query);
$row = odbc_fetch_array($update);
print $row['PASSWORD'];

输出:

18e2acd33fd3ec752c344b463d00238e35b6b77ed65941f69b9eb96471834f1e507d846071768548f8cf125d6c74ce614d477a576657983bb8620bbc49eed7d

滚动到两个哈希的最后,你会看到第二个哈希缺少一个最后的"e",所以这是抛弃了我的整个登录系统。为什么会发生这种情况?我不确定PHP还是SQL是罪魁祸首。

我使用PHP 5.4.7和数据库是一个4D SQL服务器通过ODBC连接。

编辑: password的数据类型是Text,根据4D的手册,可以容纳多达2GB的数据,所以列大小不是问题。

要确定您的问题是在MySQL还是PHP中,请直接登录MySQL并确定您是否能够在直接执行SQL命令时检索完整值。我会使用PHP正在使用的相同的SQL查询,以便您看到应用程序将看到的来自MySQL系统的相同输出。如果您在MySQL中看到截断的值(PHP不再是图片的一部分),那么您肯定知道,您已经超出了您在MySQL中定义的字段的字符限制。类似地,如果字符串完全显示,那么PHP必须截断该值。

如果PHP截断了该值,那么它可能是mysql_result对象的限制,也可能是PHP的系统限制,这似乎不太可能。通过进一步缩小问题的范围,你的答案将变得清晰。

我从来没有见过PHP截断字符串。在为电子邮件制作附件标题时,我在单个字符串值中存储了至少1兆字节的数据。我不认为你的限制在于PHP的原生语言。