1

非常に単純に暗号化された値をデータベースに保持する方法を理解しようとしています。明らかに、それほど敏感ではありません。しかし、暗号化された文字列を生成した後、crypt() 関数が文字列の前にある salt パラメータを残す方法はご存知でしょう。str_replace() を使用して削除しようとしていますが、機能していません。元の関数で使用したソルト パラメータがまだ含まれています。誰が私が間違っているのか教えてもらえますか?

<?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 パスワードはブラウザのキャッシュに残る可能性があり、salt はすべてのパスワードに対してランダムである必要があるため、使用しないでください。そうしないと、役に立たなくなります...

よく読んでください: https://security.stackexchange.com/questions/17421/how-to-store-salt

于 2013-09-24T23:41:34.057 に答える