我看到了类似的问题在这里,但我不认为答案适用于我,我如果他们这样做对不起..注册及登录密码哈希方法相同,但没有工作
继承人的代码的sniplet含有程序:
注:登录和注册工作完全没有散列元素。
if (isset($_POST['username']) && ($_POST['password'])) {
$username = trim($_POST['username']);
$username = strtolower($username);
$password = trim($_POST['password']);
$salt = hash('md5', "$username");
$password = hash('sha256', "$password"."$salt");
$stmt = $dbh->prepare("SELECT `id` FROM `1_users` WHERE username=? AND password=? LIMIT 1");
$stmt->bindValue(1, $username, PDO::PARAM_STR);
$stmt->bindValue(2, $password, PDO::PARAM_STR);
$stmt->execute();
if ($stmt->rowCount()) {
// Match
$results = $stmt->fetch(PDO::FETCH_ASSOC);
$_SESSION['id'] = $results['id'];
$_SESSION['logged_in'] = true;
$_SESSION['ip'] = hash('sha1', "{$_SERVER['REMOTE_ADDR']}");
header ("location: account.php");
}
else {
$error = 'Invalid username/password!';
}
}
if (isset($_POST['register'])) {
// check for all fields..
if ((empty($_POST['r_username'])) || (empty($_POST['r_password'])) || (empty($_POST['re_password'])) || (empty($_POST['email']))) {
$r_error = 'One of the fields was empty.';
}
$stmt = $dbh->prepare("SELECT `username` FROM `1_members` WHERE `username`=? LIMIT 1");
$username = strtolower($_POST['r_username']);
$username = trim($username);
$stmt->bindValue(1, $username, PDO::PARAM_STR);
$stmt->execute();
$row = $stmt->rowCount();
if ($row) {
$r_error = 'that username is already in use';
}
else if (($_POST['r_password']) !== ($_POST['re_password'])) {
$r_error = 'The passwords did not match.';
}
else if (strlen($_POST['r_username']) <= '3') {
$r_error = 'username too short - needs to be 4 more charicters.';
}
else if (strlen($_POST['r_password']) <='5'){
$r_error = 'password not long enough, please make it 6-255 charicters or more.';
}
else {
// woohoo lets make the account
$password = trim($_POST['r_password']);
$salt = hash('md5', "$username");
$password = hash('sha256', "$password"."$salt");
$email = trim($_POST['email']);
$stmt = $dbh->prepare("INSERT INTO `1_members` (`username`, `password`, `email`) VALUES(?,?,?)");
$stmt->bindValue(1,$username,PDO::PARAM_STR);
$stmt->bindValue(2,$password,PDO::PARAM_STR);
$stmt->bindValue(3,$email,PDO::PARAM_STR);
$stmt->execute();
$_SESSION['id'] = $dbh->lastInsertId();
$_SESSION['logged_in'] = true;
$_SESSION['ip'] = hash('sha1', "{$_SERVER['REMOTE_ADDR']}");
if ($_SESSION['active_cart']) {
header ("location: cart.php");
}
else {
header ("location: account.php");
}
}
}
之前添加散列的口令,它充当正常,即时通讯对我的问题是什么不清楚。
调试:
username: admin1
password: admin1
登录过程将打开密码:927364bb72cee168bd52c45a5d131b5923e2926eb6e8f0f46d6d7e5765cc3401
注册过程创建密码为: 927364bb72cee168bd52c45a5d131b5923e2926eb6e8f0f46d6d7e5765cc3401
它们匹配这样出了什么问题?
此外,如果我在这里得到了错误的想法,或者如果我忽略了重要的安全措施,可以请您提供更好的方法建议。
而且,我不太担心电子邮件验证,我充分意识到有大量预制snipplets可供验证的电子邮件,我会在以后的日子会越来越这一点。
任何CC都比欢迎。
编辑:该脚本返回“无效的用户名/密码组合”。
你不使用任何特殊的理由['password_hash()'](http://docs.php.net/manual /en/function.password-hash.php)? –
@SecondRikudo我没有意识到这一点,是什么让它比哈希更特别? – user3147145
它使用bcrypt并且更安全。它也非常容易使用(它为你生成盐,并有另一个函数'password_verify()'无痛地验证密码) –