我正在试图弄清楚我将如何在数据库中保留一个非常简单的加密值。显然,它并不是非常敏感。但是,您知道crypt()函数在生成加密字符串后如何将salt参数留在字符串前面。我正在尝试使用str_replace()删除它,但它无法正常工作。它仍然具有我在原始函数中使用的salt参数。谁能告诉我我做错了什么?
<?php
$password=$_GET['password'];
$salt="$2x$07$654fadkdlaf6361q4z2fs$";
$passwordCrypt=crypt($password, $salt);
echo $passwordCrypt."<br />";
$trimmed = str_replace($salt, "", $passwordCrypt);
echo $trimmed;
?>
运行脚本的结果:
$2x$07$654fadkdlaf6361q4z2fs.QpVju.Don9u/cEmr6utzgUPP9CrH6ua
$2x$07$654fadkdlaf6361q4z2fs.QpVju.Don9u/cEmr6utzgUPP9CrH6ua
答案 0 :(得分:2)
str_replace()不起作用的原因是因为您正在搜索另一个字符串中不存在的字符串。
你的盐是:
$2x$07$654fadkdlaf6361q4z2fs$
但与
不一样$2x$07$654fadkdlaf6361q4z2fs.QpVju.Don9u/cEmr6utzgUPP9CrH6ua
^ does not have a '$' on the end
你的盐最后有额外的$。
更改
$trimmed = str_replace($salt, "", $passwordCrypt);
到
$trimmed = str_replace("$2x$07$654fadkdlaf6361q4z2fs", "", $passwordCrypt);
或者您可以将salt变量更改为此(但正如Phil指出的那样,它会使您的函数crypt变得无用):
$salt = "$2x$07$654fadkdlaf6361q4z2fs";
与您的问题无关,但很高兴知道:
您不应该使用$ _GET密码,因为它们可能会留在浏览器缓存中,并且您的盐应该是随机的每个密码,否则它是无用的......
好读:https://security.stackexchange.com/questions/17421/how-to-store-salt