0

OK、PHP 5.4 スクリプトと MySQL を使用して、パスワードで保護された Web ページを作成しようとしています。サンプルを実行すると、予期しない結果が得られました。

以下を使用してパスワードを作成しました。

$salt = "";
$salt.=substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",mt_rand(0,63), 1);
$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
$pw1 = crypt($pw,$salt);

$pw1 を MySQL データベースに保存しました。

次に、認証ページで db パスワードを取得し、フォームからのユーザー入力を使用してユーザーを検証し、次のように確認しました。

get $db_pw from database then...
if (crypt($user_password,$db_pw) == $db_pw) ... proceed

すべて正常に機能しましたが、パスワードよりも長い文字列を入力しても問題ありませんでした。例: パスワードが「stack」の場合、「stackoverflow」と入力すると OK になります。「stac」と入力すると、意図したとおりに停止します。

これについて検索してみましたが、同じようなものは見つかりませんでした。私は何を間違っていますか?

4

1 に答える 1

0

crypt 関数には次の小さな注意事項があるようです。

標準の DES ベースの crypt() は、ソルトを出力の最初の 2 文字として返します。また、str の最初の 8 文字のみを使用するため、同じ 8 文字で始まる長い文字列は同じ結果を生成します (同じソルトが使用されている場合)。

したがって、「stack」と「stackoverflow」では発生せず、「stackove」と「stackoverflow」などでは発生すると思います。

を使用crypt()するのは本当に悪い考えです。石器時代のクリプトの代わりに PBKDF2 または bcrypt を使用します。

于 2013-07-28T00:35:08.767 に答える