Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中根据SSHA256哈希验证密码_Php_Validation_Passwords_Salt - Fatal编程技术网

在PHP中根据SSHA256哈希验证密码

在PHP中根据SSHA256哈希验证密码,php,validation,passwords,salt,Php,Validation,Passwords,Salt,对于使用Dovecot进行身份验证,我使用SSHA256哈希,但我不知道如何根据现有哈希验证给定密码。在web中找到的以下PHP函数用于创建SSHA256哈希: 函数ssha256$pw{ $salt=制作盐; 返回{SSHA256}.base64_编码散列'sha256',$pw.$salt,true.$salt; } 制盐功能{ $len=4; $bytes=数组; 对于$i=0;$i

对于使用Dovecot进行身份验证,我使用SSHA256哈希,但我不知道如何根据现有哈希验证给定密码。在web中找到的以下PHP函数用于创建SSHA256哈希:

函数ssha256$pw{ $salt=制作盐; 返回{SSHA256}.base64_编码散列'sha256',$pw.$salt,true.$salt; } 制盐功能{ $len=4; $bytes=数组; 对于$i=0;$i<$len;$i++{ $bytes[]=rand1255; } $salt_str=; foreach$字节为$b{ $salt_str.=pack'C',$b; } 返回$salt_str; } 输出示例:{SSHA256}lGq49JTKmBC49AUrk7wLyQVmeZ7cGl/V13A9QbY4RVKchckL

我必须提取盐吗,但是如何提取呢? 我完全迷失了解决问题的方法,有人对此有什么提示吗

谢谢大家的帮助

哦,很抱歉,我必须使用SSHA256,因为Dovecot 1.2.15只支持那些方案:
CRYPT MD5 MD5-CRYPT SHA SHA1 SHA256 SMD5 SSHA SSHA256纯明文CRAM-MD5 HMAC-MD5 DIGEST-MD5 PLAIN-MD4 PLAIN-MD5 LDAP-MD5 LANMAN NTLM OTP SKEY RPA

您需要将盐与散列值一起存储

当需要验证密码时,只需使用用户输入的密码+存储的盐再次计算哈希值。如果哈希匹配,则用户输入了正确的密码


对于您的格式,首先使用base64_decode,结果的最后4个字节将是salt。

您需要将salt与散列值一起存储

当需要验证密码时,只需使用用户输入的密码+存储的盐再次计算哈希值。如果哈希匹配,则用户输入了正确的密码


对于您的格式,首先使用base64_decode,结果的最后4个字节将是salt。

您不应该使用SHA系列进行密码哈希。它们速度快,专为高速散列文件而设计。你需要pashword散列来提高成本。使用bcrypt、PHPass或只使用这个类,我自己使用这个类,但直到你学会在其中挑出漏洞:

class PassHash {
    public static function rand_str($length) {
        $total = $length % 2;
        $output = "";
        if ($total !== 0) {
            $count = floor($length / 2);
            $output .= ".";
        } else $count = $length / 2;

        $bytes = openssl_random_pseudo_bytes($count);
        $output .= bin2hex($bytes);

        // warning: prepending with a dot if the length is odd.
        // this can be very dangerous. no clue why you'd want your
        // bcrypt salt to do this, but /shrug

        return $output;
    }
    // 2y is an exploit fix, and an improvement over 2a. Only available in 5.4.0+
    public static function hash($input) {
        return crypt($input, "$2y$13$" . self::rand_str(22));

    }

    // legacy support, add exception handling and fall back to <= 5.3.0
    public static function hash_weak($input) {
        return crypt($input, "$2a$13$" . self::rand_str(22));
    }

    public static function compare($input, $hash) {
        return (crypt($input, $hash) === $hash);
    }
}

这是因为SHA256是256位或64个十六进制字符。您可以始终假定前64个字符是散列

您不应该使用SHA系列进行密码散列。它们速度快,专为高速散列文件而设计。你需要pashword散列来提高成本。使用bcrypt、PHPass或只使用这个类,我自己使用这个类,但直到你学会在其中挑出漏洞:

class PassHash {
    public static function rand_str($length) {
        $total = $length % 2;
        $output = "";
        if ($total !== 0) {
            $count = floor($length / 2);
            $output .= ".";
        } else $count = $length / 2;

        $bytes = openssl_random_pseudo_bytes($count);
        $output .= bin2hex($bytes);

        // warning: prepending with a dot if the length is odd.
        // this can be very dangerous. no clue why you'd want your
        // bcrypt salt to do this, but /shrug

        return $output;
    }
    // 2y is an exploit fix, and an improvement over 2a. Only available in 5.4.0+
    public static function hash($input) {
        return crypt($input, "$2y$13$" . self::rand_str(22));

    }

    // legacy support, add exception handling and fall back to <= 5.3.0
    public static function hash_weak($input) {
        return crypt($input, "$2a$13$" . self::rand_str(22));
    }

    public static function compare($input, $hash) {
        return (crypt($input, $hash) === $hash);
    }
}


这是因为SHA256是256位或64个十六进制字符。您可以始终假定前64个字符是散列

您应该使用加密安全的salt和迭代散列。更好的方法是使用bcrypt,它可以为您完成所有这些。您应该使用加密安全的salt和迭代哈希。更好的是,只需使用bcrypt,它可以为您完成所有这些。嗨,谢谢您的快速回答!salt实际上是与hash一起存储的,但我不知道如何将它从Base64中打包的原始格式中取出。看,salt被附加到hash原始输出中,然后整个内容都用Base64编码。当我尝试使用base64_解码时,我得到了二进制数据,但我不知道如何处理它。二进制数据的最后4个字节是salt,其余的是散列。更具体地说,LDAP样式的salt是所有不是散列的字节。它可以是任何长度:嗨,谢谢你的快速回答!salt实际上是与hash一起存储的,但我不知道如何将它从Base64中打包的原始格式中取出。看,salt被附加到hash原始输出中,然后整个内容都用Base64编码。当我尝试使用base64_解码时,我得到了二进制数据,但我不知道如何处理它。二进制数据的最后4个字节是salt,其余的是散列。更具体地说,LDAP样式的salt是所有不是散列的字节。它可以是任何长度:嗨,非常感谢你的回答!我所有的脚本都使用Bcrypt,但不幸的是,Dovecot 1.2不支持它。这些是受支持的方案:CRYPT MD5 MD5-CRYPT SHA1 SHA256 SMD5 SSHA SSHA256纯明文CRAM-MD5 HMAC-MD5 DIGEST-MD5 PLAIN-MD4 PLAIN-MD5 LDAP-MD5 LANMAN NTLM OTP SKEY RPAOuch。没有机会在中添加支持?非常感谢您的帮助!据我所说,我用uniqid代替了盐。哦,我不得不去掉括号:str_替换{SSHA256},$hash;谢谢大家!@Fips-我在中发现了一个提示,在某些情况下,通过CRYPT方案支持迭代哈希。如果您的系统支持此方案,那么您应该真正使用此方案。关于salt,加密强salt应该来自操作系统随机源,因此是唯一和不可预测的,另一边的uniqid或多或少是一个时间戳。谢谢,我会看看它,现在我将更改salt。嗨,非常感谢你的回答!我所有的脚本都使用Bcrypt,但不幸的是,Dovecot 1.2没有
支持它。这些是受支持的方案:CRYPT MD5 MD5-CRYPT SHA1 SHA256 SMD5 SSHA SSHA256纯明文CRAM-MD5 HMAC-MD5 DIGEST-MD5 PLAIN-MD4 PLAIN-MD5 LDAP-MD5 LANMAN NTLM OTP SKEY RPAOuch。没有机会在中添加支持?非常感谢您的帮助!据我所说,我用uniqid代替了盐。哦,我不得不去掉括号:str_替换{SSHA256},$hash;谢谢大家!@Fips-我在中发现了一个提示,在某些情况下,通过CRYPT方案支持迭代哈希。如果您的系统支持此方案,那么您应该真正使用此方案。关于salt,加密强salt应该来自操作系统随机源,因此是唯一和不可预测的,另一边的uniqid或多或少是一个时间戳。谢谢,我会看看它,现在我将更改salt。