3

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

4

2 回答 2

3

crypt()使用操作系统使用的任何底层哈希函数,因此如果您想要可靠(恒定)的结果,您可以使用其他哈希函数之一,例如md5()sha256(),sha512()

如果您希望crypt()使用特定的散列函数,则必须相应地指定散列参数并检查主机操作系统是否支持该算法。例如(取自crypt() 的 PHP 手册页):

if (CRYPT_STD_DES == 1) {
        echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";
} 

但它非常依赖于操作系统,所以我建议您使用独立的哈希函数。或hash()

附加:

使用hash()您将首先使用hash_algos()来检查哪个哈希是支持的最佳哈希,然后将其用作第一个参数,如下所示:

<?php
    $algos = hash_algos();
    if (in_array("sha256", $algos)) {
        $pass = hash ("sha256", "userpassword" . "salt");
    }
?>

希望这可以帮助。

于 2010-12-15T08:17:58.797 回答
0

没有看到实际代码很难说,但假设指定的哈希值受底层代码支持,情况就不应该如此。在 PHP 5.3 之前,这是操作系统代码,但从 5.3 开始,哈希是在 PHP 中实现的。

vanneto提供的信息有点误导。crypt 期望盐的格式来指示使用的算法,例如,如果你想要河豚,那么你会提供一个盐:

$2a$xx$yyyyyyyyyyyyyyyyyyyyyy

其中 xx 表示重复次数, yyyy... 是 (22) base64 数字中的实际盐。vanneto(2 个字母)提供的示例应该使用单轮 DES。

于 2010-12-15T10:06:47.937 回答