1

我试图弄清楚我将如何在数据库中保留一个非常简单的加密值。很明显,这没什么特别敏感的。但是,您知道 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
4

1 回答 1

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

于 2013-09-24T23:41:34.057 回答