不同操作系统上的PHP crypt功能

时间:2010-12-15 08:12:03

标签: php php-5.3

在我的php应用程序中,我使用php crypt()函数,其中我的salt值是用户名中的前两个字符。我注意到该函数在windows和linux上返回不同的结果。我还在w3cschools上读到这个函数在不同的操作系统上表现不同。可以配置php环境以便在两个操作系统上获得相同的结果吗? (修改加密模式不是一种选择。)

2 个答案:

答案 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。