这就是我这样做.
//please ignore the Syntax error if any $data = '11'; $dbpass = password_hash($data,PASSWORD_BCRYPT); echo $dbpass; // displays the random strings on each page refresh.
一旦密码保存到数据库中,登录过程中就不会匹配.下面是我的实际功能.
private function process_data($password){ $password = __STR.$password.__STR; return password_hash($password,PASSWORD_BCRYPT); } private function processed($login_password,$dbpassword){ $login_password = __STR.$login_password.__STR; return password_verify($login_password,$dbpassword); }
首先,它是散列,而不是加密.加密是双向的,散列是一种方式.我们要哈希.我们从不想加密.是的,术语很重要.请使用正确的术语.
接下来,每次调用password_hash应该返回一个不同的哈希.那是因为它产生了强大的随机盐.这是它的设计方式,以及你如何真正使用它.
此外,请勿在密码前后添加__STR中的“胡椒”.你什么都不做,但可能会削弱用户的密码(这不是很好).如果你想要更多的信息,为什么这是一个坏主意:Read This Answer.
继续,我强烈建议您不要直接使用crypt.实际上令人惊讶的是容易产生非常弱的哈希值.这就是为什么password_ * api的设计. crypt是一个低级别的库,你想在代码中使用一个高级库.有关如何解决bcrypt的更多信息,请查看我的博客:Seven Ways To Screw Up Bcrypt.
密码API被设计为一个简单的一站式服务.如果它不适用于您,请检查以下事项:
你使用PHP> = 5.5.0?或者您是否使用PHP> = 5.3.7与password_compat?
>您的数据库列是否足够宽?
它需要至少60个字符.
>你是否检查该函数的结果是一个字符串,而不是bool(false)?
如果有内部错误,它将从password_hash返回一个非字符串.
>你有任何错误吗?
您是否将error_reporting设置为最大设置(我建议使用-1来捕获所有内容),并检查代码是否没有发生任何错误?
您确定正确使用它吗?
function saveUser($username,$password) { $hash = password_hash($password,PASSWORD_BCRYPT); // save $username and $hash to db } function login($username,$password) { // fetch $hash from db return password_verify($password,$hash); }
请注意,每个应该只调用一次.
你正在使用PHP< 5.3.7与password_compat?如果是这样,这是你的问题.您正在使用不支持的PHP版本的兼容性库.您可以使其正常工作(某些RedHat发行版已经反映了必要的修复),但是您使用的是不受支持的版本.请升级到合理的版本.
$hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG'; $test = crypt("password",$hash); $pass = $test == $hash; echo "Test for functionality of compat library: " . ($pass ? "Pass" : "Fail"); echo "\n";