gpt4 book ai didi

php - 使用 sha1 和 salt 存储密码

转载 作者:可可西里 更新时间:2023-11-01 00:15:19 25 4
gpt4 key购买 nike

我有一个用 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 类,例如您在上面的脚本中看到的验证类。使用这两种样式是否会导致任何性能问题?

最佳答案

没有。停止你正在做的事情,阅读How to securely hash passwords ,然后阅读 Secure hash and salt for PHP passwords :

最重要的是:

  • Use scrypt when you can; bcrypt if you cannot.
  • Use PBKDF2 if you cannot use either bcrypt or scrypt.

参见 this answer用于比较 PBKDF2、bcrypt 和 scrypt。

另请参阅经常链接的文章 How To Safely Store A Password :

[MD5, SHA1, SHA256, SHA512, SHA-3, etc] are all general purpose hash functions, designed to calculate a digest of huge amounts of data in as short a time as possible. This means that they are fantastic for ensuring the integrity of data and utterly rubbish for storing passwords.

PHPass可能是在 PHP 中执行 bcrypt 散列的最简单方法。您也可以do it the hard way使用 crypt functionCRYPT_BLOWFISH(如果需要),但请注意,有很多方法会出错,而且界面相当神秘(比如指定盐值的方式)。

关于php - 使用 sha1 和 salt 存储密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13115242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com