str_replace()在crypt()输出上无法正常工作

时间:2013-09-24 23:33:13

标签: php

我正在试图弄清楚我将如何在数据库中保留一个非常简单的加密值。显然,它并不是非常敏感。但是,您知道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

1 个答案:

答案 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