0

我以前从未fatal error在 PHP 中看到过这种情况......当我在 github 上找到一个密码哈希类时,它就开始了:

 $Config = array(
        "Depreciated" => 1,
        "Notices" => 1,
        "Errors" => 1,
        "Warnings" => 1,
    );
    $Salt_Settings= 1;
    $Password_Hashing = new SlayerSolutions\Authentication($Salt_Settings,$Config);

$Password_Hashing ->SetSalt("f4dd32"); 
$Password_Hashing ->SetKey("Login"); 
$Password_Hashing ->SetPositioning(0); 

$Password_Entities = $Password_Hashing ->Password_Props($_POST['Password']);
$Result_Array = $Password_Hashing ->Hash_Password($Password_Entities );

这将返回:

致命错误:散列函数的错误使用。这必须在一个步骤过程中执行。

我无法查看该类的实际代码结构,因为它似乎是用 ioncube 或其他东西编码的

4

1 回答 1

3

您的错误来自没有这样做:

 $Formatted_Password = $FrameWork->Format_Password($Password_Entities);

这实际上设置了$this->Props_Called = 1;. 完全没有意义的狗屎。

为什么你不应该使用这个:

第一个 OMGWTFBBQ 时刻:

else{
        $length = mt_rand(0,25);
        $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
        $string = '';

        for ($p = 0; $p < $length; $p++) {
            $string .= $characters[mt_rand(5, strlen($characters) -1)];
        }
        $this->Salt = $string; // Set Salt Randomly Generated
 }

这段代码生成一个随机盐。这家伙没有利用完整的 255 字节范围或更多的 ASCII,而是将自己限制为 36。熵不是 255^N,而是 36^N。这是一个很大的损失。

第二个WTF时刻:

if ($this->Positioning == 0){
            $Return_Array['SaltedPassword'] = $Password_Props['Password'].$Password_Props['Salt'];
        }
        if ($this->Positioning == 1){
            $Return_Array['SaltedPassword'] = $Password_Props['Salt'].$Password_Props['Password'];

HMAC的全部要点是对密钥进行加盐,而不是对消息进行加盐。这有一个非常重要的原因:这是由于 HMAC 散列的工作方式。盐在键中“双重浸入”,而如果它在值中则不会。

(备案HMAC-ALGO = ALGO( (key XOR pad1) CONCAT ALGO( (key XOR pad2) CONCAT value)):)

是一个重大问题。通过这样做,你又一次失去了很多。马上; 如果您的盐在值中,则您的算法等效于 ALGO(key ALGO(value)),这并不比 ALGO(value.key) 好。

这一点的参考在这里:https ://stackoverflow.com/a/7273257/2167834

于 2013-05-17T14:57:26.680 回答