PHP使用blowfish&;盐业;胡椒粉

PHP使用blowfish&;盐业;胡椒粉,php,hash,salt,blowfish,crypt,Php,Hash,Salt,Blowfish,Crypt,我想用PHP在MySQL数据库中存储安全的用户密码 我怎样才能做得更好 我的班级: private static$algo='$2a'; 私有静态$cost='10'; 私有静态$pepper='eMI8MHpEByw/M4c9o7sN3d'; 公共静态函数generateSalt($length){ $randomBinaryString=mcrypt\u create\u iv($length,mcrypt\u DEV\u uradom); $randomEncodedString=str_

我想用PHP在MySQL数据库中存储安全的用户密码

我怎样才能做得更好

我的班级:

private static$algo='$2a';
私有静态$cost='10';
私有静态$pepper='eMI8MHpEByw/M4c9o7sN3d';
公共静态函数generateSalt($length){
$randomBinaryString=mcrypt\u create\u iv($length,mcrypt\u DEV\u uradom);
$randomEncodedString=str_replace('+','.',base64_encode($randomBinaryString));
返回substr($randomEncodedString,0,$length);
}
公共静态函数generateHash($password){
如果(!已定义('CRYPT_-BLOWFISH'))
die(“需要CRYPT_河豚算法(PHP5.3)”;
$password=hash_hmac('sha256',$password,self:$pepper,false);
返回crypt($password,self::$algo.self::$cost.'$'.self::generateSalt(22));
}
公共静态函数checkPassword($hash,$password){
$salt=substr($hash,0,29);
$password=hash_hmac('sha256',$password,self:$pepper,false);
$new_hash=crypt($password,$salt);
返回($hash==$new\u hash);
}
可以使用answer的建议(对于PHP>=5.5),也可以使用下面的类。感谢您指出
密码\u散列
函数。我仔细阅读了代码,在
password\u hash
中我看到的唯一不同之处是错误检查和
DEV\u uradom
使用操作系统生成更随机的salt

class PassHash {
    public static function rand_str($length) {
        $chars = "0123456789./qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
        //only allowed chars in the blowfish salt.
        $size = strlen($chars);
        $str = "";
        for ($i = 0; $i < $length; $i++)
            $str .= $chars[rand(0, $size - 1)]; // hello zend and C.
        return $str;
    }
    public static function hash($input) {
        return crypt($input, "$2y$13$" . self::rand_str(22));
        // 2y is an exploit fix, and an improvement over 2a. Only available in 5.4.0+
    }
    public static function hash_weak($input) {
        return crypt($input, "$2a$13$" . self::rand_str(22)); }
        // legacy support, Add exception handling and fall back to <= 5.3.0
    public static function compare($input, $hash) {
        return (crypt($input, $hash) === $hash);
    }
}
类PassHash{
公共静态函数rand_str($length){
$chars=“0123456789./qwertyuiopasdfghjklzxcvnmqwertyuiopasdfghjklzxcvnm”;
//只允许在河豚盐中加入焦炭。
$size=strlen($chars);
$str=”“;
对于($i=0;$i<$length;$i++)
$str.=$chars[rand(0,$size-1)];//你好,zend和C。
返回$str;
}
公共静态函数散列($input){
返回密码($input,“$2y$13$”。self::rand_str(22));
//2y是一个漏洞修复,是对2a的改进。仅在5.4.0中可用+
}
公共静态函数hash_弱($input){
返回crypt($input,“$2a$13$”。self::rand_str(22));}

//旧版支持,添加异常处理并退回到虽然这在技术上是有答案的,但您的问题是相当随意和开放的,应该重新编写以解决特定问题。抱歉,这是我的第一个“问题”,下次我会做得更好!没问题;我给出了一个大致的答案,并提供了一些关于散列和安全性的一般提示。看看新PHP函数
password\u hash()
password\u verify()的用法这个代码不应该在代码审查SE中吗?非常感谢你的好提示,我会考虑这个问题。@ FielpPeytBCRIPT散列与他们一起存储盐。只需将输入传递到:CuffReAube()/代码>,它在我使用的五个站点中都很好()-单独要求盐、胡椒粉、哈希和选项是我从未做过的事。@FillipPeyton哈希和盐在同一个字符串中。它的形式是
$$$
。存储并比较;它实际上与
PassHash::compare($password\u input,$hash\u from\u database)一样简单;//如果正确则为true,否则为false
。您可能想得太多了。