我在使用以下代码将密码输入数据库之前对其进行哈希处理:
$user_password = hash( 'sha512', $_POST['user_pass'] );
我按照这个this教程通过mySQL数据库验证OpenVPN用户。在其中,我们设置了以下文件,我认为该文件验证了对mySQL数据库的请求。该脚本是: “ /etc/openvpn/script/login.sh ”,它包含以下内容:
#!/bin/bash
. /etc/openvpn/script/config.sh
##Authentication
user_id=$(mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -sN -e "select user_id from user where user_id = '$username' AND user_pass = '$password' AND user_enable=1 AND user_start_date != user_end_date AND TO_DAYS(now()) >= TO_DAYS(user_start_date) AND (TO_DAYS(now()) <= TO_DAYS(user_end_date) OR user_end_date='0000-00-00')")
##Check user
[ "$user_id" != '' ] && [ "$user_id" = "$username" ] && echo "user : $username" && echo 'authentication ok.' && exit 0 || echo 'authentication failed.'; exit 1
只要未对密码进行哈希处理,就可以正常工作。如何使用相同的方法,但对具有散列密码的用户进行身份验证?
答案 0 :(得分:1)
SHA *哈希函数不适合密码,因为它们的速度太快了。看看PHP函数password_hash(),它将生成一个BCrypt哈希并负责生成安全盐。对于较旧的PHP版本,还存在compatibility pack。
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
这也意味着您无法直接在SQL语句中验证密码,而是在第一步中从数据库中读取哈希值(通过用户名),然后使用此哈希值调用password_verify()。