問題があります。データベースからSALT-Valueを取得すると、ハッシュされたパスワードとデータベースのパスワードが一致しません。パスワードの最後にそれを追加するために、ランダムな塩を生成するSQL-DatabaseでPHPが生成した塩は、そこから取得したときに等しくない
register.php
- 。
- 完全な値をハッシュします。
- ユーザー名、ハッシュパスワード、および塩をデータベースに挿入します。 login.php
while($row){ $SALT = random_bytes(32); $SALT = bin2hex($SALT); $query = "SELECT 1 FROM usr_accounts WHERE SALT = :SALT"; $query_params = array(':SALT' => $SALT); try{ $stmt = $db->prepare($query); $result = $stmt->execute($query_params); } catch(PDOException $ex){ die("Failed to run query: " . $ex->getMessage()); } $row = $stmt->fetch(); if(empty($row)){ break; } } for($hashnr = 0; $hashnr < 128; $hashnr++){ $PASSWORD = hash('sha256', $_POST['PASSWORD'].$SALT); } $query = "INSERT INTO usr_accounts (USERNAME, PASSWORD, SALT, EMAIL) VALUES (:USERNAME, :PASSWORD, :SALT, :EMAIL)"; $query_params = array(':USERNAME' => $_POST['USERNAME'], ':PASSWORD' => $PASSWORD, ':SALT' => $SALT, ':EMAIL' => $_POST['EMAIL']); try{ $stmt = $db->prepare($query); $result = $stmt->execute($query_params); } catch(PDOException $ex) { die("Failed to run query: " . $ex->getMessage()); }
- 完全な値をハッシュします。
- パスワードの値が等しいかどうかを確認します。あなたはpassword_hash()を使用する必要があります
$query = "SELECT ID, USERNAME, PASSWORD, SALT FROM usr_accounts WHERE USERNAME = :USERNAME";
$query_params = array(':USERNAME' => $_POST['USERNAME']);
try{
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex){
die("Failed to run query: " . $ex->getMessage());
}
$login_ok = false;
$row = $stmt->fetch();
if($row){
for($hashnr = 0; $hashnr < 128; $hashnr++){
$check_password = hash('sha256', $_POST['PASSWORD'].$row['SALT']);
}
}
組み込みのPHPパスワードlibを使用してください。はるかに安全な、はるかに安全 – JimL