2

我一直在寻找存储用户密码的最佳方式,但我并不真正了解安全性,因此我使用 Google 找到了很多关于加密和类似内容的信息。

我不喜欢使用可以在 Internet 上的博客或网站中获得的片段,我宁愿创建自己的解决方案,所以我最终开发了两个函数:一个创建哈希值,另一个检查“哈希值”密码。

我不知道我做的对不对,或者我只是在增加我的问题,所以看看下面的函数。

// Creates a simple password's hash
function hashPassword( $password = false )
{
  // Checks if the password has more than 6 characters
  if( strlen( $password ) < 6 )
  {
    // Kills the script
    exit('Password is too short.');
   }

   // Split the 4 first characters of the password
   $salt = substr( $password, 0, 4 );

   // Calculate the md5 hash of the salt
   $salt = md5( $salt );

   // Get the rest of the password
   $password =  substr( $password, 3, strlen( $password ) );

   // Calculate the md5 hash of the password
   $password = sha1( $salt . $password );

   // Crypt the password
   $password = crypt( $password );

   return $password;
}

这就是我要存储的密码。现在,检查一下我要检查密码是否正确的方法。

// Checks if a hashed password match a user input password
function checkHashedPassword( $password = false, $hashedPassword = false )
{
// Checks if the password has more than 6 characters
if( strlen( $password ) < 6 )
{
    // Kills the script
    exit('Password is too short.');
}

// Split the 4 first characters of the password
$salt = substr( $password, 0, 4 );

// Calculate the md5 hash of the salt
$salt = md5( $salt );

// Get the rest of the password
$password =  substr( $password, 3, strlen( $password ) );

// Calculate the md5 hash of the password
$password = sha1( $salt . $password );

// Checks the password and hash
if( crypt( $password, $hashedPassword ) == $hashedPassword ) 
{
    // Returns true
    return true;
}

// Returns false by default
return false;
}

如您所见,我将创建一个存储密码的变量,然后我可以检查它是否正常,如下面的代码:

$pass = hashPassword( $_POST['password'] );

if( !checkHashedPassword( $_POST['password'], $pass ) ) 
{
    exit('Password incorrect!');
}

那么,它会安全地工作吗?

4

3 回答 3

3

如果您正在寻找一种通用且简单的方法添加简单的密码哈希 API仍在 RFC for php 中,但您可以使用ircmaxwell 的非常好的实现

例子

  $hash = password_hash($password, PASSWORD_BCRYPT);

确认

if (password_verify($password, $hash)) {
    /* Valid */
} else {
    /* Invalid */
}

在这里下载

于 2012-10-18T21:39:57.653 回答
1

您可以使用:

$pass = <query password code>;

if( $pass != hashPassword( $_POST['password'] ); ) 
{
    exit('Password incorrect!');
}
于 2012-10-18T21:35:16.233 回答
1

来自 OWASP的密码存储备忘单为密码存储和散列提供了很好的指南。

关键点是使用强盐,并迭代哈希(目前 64,000 次或更多)。

OpenWall 的Portable PHP Password Hashing Framework是一个很好且广泛使用的用于密码处理的 PHP 库,我建议检查一下。

于 2012-10-18T21:50:06.843 回答