在我的php应用程序中,我使用php crypt()函数,其中我的salt值是用户名中的前两个字符。我注意到该函数在windows和linux上返回不同的结果。我还在w3cschools上读到这个函数在不同的操作系统上表现不同。可以配置php环境以便在两个操作系统上获得相同的结果吗? (修改加密模式不是一种选择。)
答案 0 :(得分:3)
crypt()使用操作系统使用的任何底层哈希函数,因此如果您需要可靠(常量)结果,可以使用其他哈希函数之一,例如 md5()或 sha256(),sha512()。
如果希望 crypt()使用特定的散列函数,则必须相应地指定散列参数,并检查主机操作系统是否支持该算法。例如(取自PHP Manual page of crypt()):
if (CRYPT_STD_DES == 1) {
echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";
}
但它非常依赖操作系统,因此我建议您使用独立的哈希函数。或hash()。
附加:
使用 hash(),您首先要使用 hash_algos()来检查哪个哈希值是支持的最佳哈希值,然后将其用作第一个参数,如下所示:< / p>
<?php
$algos = hash_algos();
if (in_array("sha256", $algos)) {
$pass = hash ("sha256", "userpassword" . "salt");
}
?>
希望这有帮助。
答案 1 :(得分:0)
很难说没有看到实际的代码,但假设底层代码支持指定的散列,则不应该这样。在PHP 5.3之前,这是操作系统代码,但从5.3开始,哈希在PHP中实现。
vanneto提供的信息有点误导。 crypt期望盐的格式表示所使用的算法,例如如果你想要河豚那么你会提供盐:
$2a$xx$yyyyyyyyyyyyyyyyyyyyyy
其中xx表示重复次数,yyyy ...是(22)base64位的实际盐。 vanneto提供的示例(2个字母)应使用单轮DES。