現在、登録スクリプトを改訂して、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ステートメントが登録の速度に影響しないのはなぜですか?