【これだけ】PHPでのパスワードのハッシュ化【現役エンジニアが解説】

PROGRAM

今回は、PHPでのパスワードのハッシュ化について、パスワードの登録方法とパスワードの認証方法に分け、簡単に解説していきます。

パスワードの登録方法

まず、PHPでパスワードをハッシュ化して登録するためには、データベースのパスワードカラムの上限文字数を多めに確保しておきましょう。

CREATE TABLE users (
    userid VARCHAR(50),
    password VARCHAR(255),
    PRIMARY KEY(userid)
);

上記のコードは、MySQLでユーザテーブルを作成するサンプルのSQL文ですが、ハッシュ化されると文字列が長くなるため、パスワードカラムの上限文字数は255文字としています。

$pdo = new PDO("mysql:host={host};dbname={dbname}", "{user}", "{password}");
$sql = "INSERT INTO users (userid, password) VALUES (:userid, :password)";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":userid", $_POST['userid'], PDO::PARAM_STR);
$stmt->bindValue(":password", password_hash($_POST['password'],PASSWORD_BCRYPT), PDO::PARAM_STR);
$stmt->execute();

データベース側の入れ物の用意ができた後は、PHP側で、上記のコードのように、PHPの標準関数であるpassword_hash関数を使ってパスワードをハッシュ化して、データベースに接続しそれを登録します。

パスワードの認証方法

ハッシュ化されたパスワードで認証するためには、まずはログイン画面で入力されたユーザIDのハッシュ化されたパスワードをデータベースより取得します。

次に、データベースのハッシュ化されたパスワードとログイン画面より入力されたユーザIDのパスワードが一致するかを検証し、ログイン処理を行っていきます。

$pdo = new PDO("mysql:host={host};dbname={dbname}", "{user}", "{password}");
$sql = "SELECT user_id, name from users WHERE name = :name";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":userid", $_POST['userid'], PDO::PARAM_STR);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$user || !password_verify($_POST['password'], $user['password'])) {
    echo 'ユーザIDもしくはパスワードが正しくありません。';
}

session_regenerate_id(true);
$_SESSION['is_login'] = true;

上記のコードでは、ログイン画面より入力されたユーザIDでデータベースよりハッシュ化されたパスワードを取得し、PHPの標準関数であるpassword_verify関数で、ログイン画面で入力されたパスワードと一致するかを検証し、ログイン処理を行っています。

パスワード関数の利点

自前でパスワードのハッシュ化を行う場合、PHPではhash関数等を使って、ソルトを作るところから実装していく必要があります。

しかし、PHPでは、標準関数として登録にはpassword_hash関数が、認証にはpassword_verify関数が用意されており、この面倒な処理を省くことができます。

もちろん、password_hash関数やpassword_verify関数の内部では、ソルトを作る等の煩雑な処理が実装されているため、簡単であると同時に高い安全性を保ちながら、パスワードをハッシュ化することができるのです。