0

現在、登録スクリプトを改訂して、PDOとbcryptを追加しています。ただし、ハッシュを反復処理しようとすると、エラーが発生します。60000以上のラウンドのチュートリアルを見たので、最初はラウンドを10000に設定していましたが、それは時間がかかりました。それで、テストするためだけに2に設定すると、エラーが発生しました。

[Tue Dec 25 10:45:07 2012] [error] [] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 133431193 bytes) in /var/www/register_script.php on line 28, referer: 

私の登録スクリプト全体は休閑中です:

<?php 
//Minor work needed need to finish user verification 


$host="localhost"; // Host name
$username="root"; // Mysql username
$password="testdbpass"; // Mysql password
$db_name="test"; // Database name

// Connect to server via PHP Data Object
$dbh = new PDO("mysql:host=localhost;dbname=test;", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

CRYPT_BLOWFISH or die ('No Blowfish found.');

// Creating the salt
$Blowfish_Pre = '$2y$15$';
$Blowfish_End = '$';


$Allowed_Chars =
'/.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$char_len = 63;

$salt_length = 60;
for($round=0;$round<$salt_length;$roundi++)
{
    $salt .= $Allowed_Chars[mt_rand(0,$char_len)];
}
$bcrypt_salt = $Blowfish_Pre . $salt . $Blowfish_End;
//Salt creating stops here

//Creating the hash and password
$password = $_POST['password'];

$hashed_password = crypt($password, $bcrypt_salt);
for($round=0; $round<2; $round++)
    {
        $hashed_password = crypt($password, $bcrypt_salt);
    }

// Insert statements with PDO 

try {
        $query = $dbh->prepare("INSERT INTO `users_blowfish` (username, email, fname, lname, salt, password) 
                               VALUES (:username, :email, :first, :last, :salt, :hash)");

        $query->execute(
                        array(
                        'username' => $_POST['username'],
                        'email' => $_POST['email'], 
                        'first' => $_POST['fname'],
                        'last' => $_POST['lname'],
                        'salt' => $bcrypt_salt,
                        'hash' => $hashed_password
                        )); 
    }

    catch (PDOException $e) {
        error_log($e->getMessage());
        die($e->getMessage());
    }

    $dbh= null;

    ?>

<html>
    <body>
        <p> 
            Thank you for registering your account. Please wait for administrator approval before doing anything else. Thank you - System Administrator. 
        </p>
    </body>
</html> 

forステートメントを取り出した場合:

$hashed_password = crypt($password, $bcrypt_salt);
for($round=0; $round<2; $round++)
    {
        $hashed_password = crypt($password, $bcrypt_salt);
    }

その後、それはすべて機能します。しかし、私を混乱させるのは、上記のステートメントに2つあることです^

そしてこれ:

$salt_length = 60;
for($round=0;$round<$salt_length;$roundi++)
{
    $salt .= $Allowed_Chars[mt_rand(0,$char_len)];
}

要約すると、1)ハッシュによるforステートメントによって登録が非常に遅くなり、ソルト作成によるforステートメントが登録の速度に影響しないのはなぜですか?

4

1 に答える 1

1

crypt()Blowfishはすでに複数のハッシュ ラウンドを使用しておりcrypt()、実際のハッシュ処理のすべての作業を行っているため、ループを繰り返すとページの処理に時間がかかります。したがって、crypt()複数回実行すると、そのたびにすべての作業を行うことになります。

ソルトに数文字を追加するループは、実際の作業を行っていないため、時間には影響しません。文字列に数文字を追加するだけです。

crypt()複数回ループする必要はありません。作業要素を含む bcrypt を既に使用しています。

また、塩を別々に保管する必要もありません。bcrypt によって生成されたハッシュには、独自のソルトが含まれています。

于 2012-12-25T16:22:30.473 に答える