3

私はphpで簡単な登録スクリプトを作成しましたが、私が行っている方法がユーザーパスワードを保存するのに十分安全であるかどうかに興味がありました. 32 ビットのランダム ソルトを生成し、それを sha1 ハッシュ化パスワードに追加しています。

//create new validator object
    $validator = new data_validation();
    //validate user input
    $firstName = $validator->validate_fname($firstName); //is the first name a string?
    $lastName = $validator->validate_lname($lastName); // is the last name a string?
    $username = $validator->validate_username($username); // is the username a string?
    $email = $validator->validate_email($email); //is the email in valid format?

    //make sure there isn't duplicate emails
    $valQuery = $link->query("SELECT email FROM users WHERE email = '" .$email. "'");

    if ($valQuery->num_rows == 1) {
        echo "An email is already registered with that address";
        return false;
    }

    // generate a random salt for converting passwords into sha1
    $salt = $link->real_escape_string(bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)));
    $saltedPW =  $password . $salt;
    $hashedPW = sha1($saltedPW);

    mysqli_connect($db_host, $db_user, $db_pass) OR DIE (mysqli_error());
    // select the db
    mysqli_select_db ($link, $db_name) OR DIE ("Unable to select db".mysqli_error($db_name));

     // our sql query
    $sql = "INSERT INTO users (first_name, last_name, username, email, password, salt) VALUES ('$firstName', '$lastName', '$username', '$email', '$hashedPW', '$salt');";

    //save the updated information to the database          
    $result = mysqli_query($link, $sql) or die("Error in Query: " . mysqli_error($link));

    if (!mysqli_error($link)) 
    {
        $row = mysqli_fetch_assoc($result);
        $_SESSION['user_id'] = $row['user_id'];
        $_SESSION['loggedin'] = TRUE;
        header("Location: ../home");
    }

また、プロシージャルと oop php を組み合わせて使用​​しています。そのほとんどは手続き型で行われますが、上記のスクリプトで使用されている検証クラスなど、いくつかの oop クラスがあります。両方のスタイルを使用すると、パフォーマンスの問題が発生しますか?

4

2 に答える 2

6

いいえ。あなたがしていることをやめて、How to secure hash passwordsを読んでから、Secure hash and salt for PHP passwords を読んでください:

最も重要なこと:

  • 可能な場合は scrypt を使用してください。できない場合は bcrypt を使用してください。
  • bcrypt または scrypt を使用できない場合は、PBKDF2 を使用します。

PBKDF2、bcrypt、および scrypt の比較については、この回答を参照してください。

また、頻繁にリンクされる記事How To Safely Store A Passwordも参照してください。

[MD5、SHA1、SHA256、SHA512、SHA-3 など] はすべて汎用ハッシュ関数であり、大量のデータのダイジェストをできるだけ短時間で計算するように設計されています。これは、データの整合性を確保するのに優れていることと、パスワードを保存するのにまったく役に立たないことを意味します。

PHPassは、おそらく PHP で bcrypt ハッシュを行う最も簡単な方法です。必要に応じてcrypt 関数を使用して難しい方法で行うこともできますが、間違った方法がたくさんあり、インターフェースがかなり難解であることに注意してください (salt 値の指定方法など)。CRYPT_BLOWFISH

于 2012-10-29T02:42:39.243 に答える
2

手続き型とオブジェクト指向の切り替え自体は、パフォーマンスには影響しません。クラスのロードとインスタンス化のオーバーヘッドは無視できます。ただし、成長するオブジェクト指向以外のコードベースを管理することは、無視できないタスクになる可能性があります。

挿入 (ソルト) にフィールドを追加しても、何の影響もありません。ソルトを使用しても、sha1 アルゴリズムをパスワードの末尾に追加することによってオーバーヘッドが追加されることはありません。

ランダムなソルトを生成する方法に少し混乱していますが、システムに負荷がかかるようにも見えません。

于 2012-10-29T02:41:08.620 に答える