在mysql数据库中保护用户密码的最佳方法?

时间:2012-02-02 07:06:21

标签: php mysql encryption hash

我正在尝试找到在mysql数据库中保护用户密码的最佳方法(哈希/加密方式)。我哪种方法最安全,最难破解。我在加密/散列等领域的经验不是很多。目前我正在使用一种非常不安全的方法来进行这种加密:

$encrypted_password = strrev(base64_encode($password));

我知道这不是最好的方法,但就像我说的那样,我是新人。有人能指出我正确的方向吗?

感谢。

10 个答案:

答案 0 :(得分:5)

使用bcrypt

  

Bcrypt是一种自适应密码散列算法,它使用Blowfish密钥时间表,而不是对称加密算法。

答案 1 :(得分:2)

编辑:你应该看看hash_hmac()。我认为这比腌制更好。

您可以使用sha1和盐:

$salt = "some random string";
$encrypted_password = sha1($salt.$password);

如果有人设法获取加密密码列表,您添加盐会使rainbow tables更难使用。

你可以使用任何单向散列方法(我只喜欢sha1),但最好在散列之前将其加盐。

答案 2 :(得分:0)

使用 hash_hmac 存储加密密码

如果您需要明文密码,请使用 des / aes / 3des

答案 3 :(得分:0)

以下是an article from Php.net,其中谈到了“安全密码哈希”。

来自文章:

当散列密码时,两个最重要的考虑因素是计算费用和盐。散列算法的计算成本越高,暴力输出的时间就越长。

有两个与PHP捆绑的函数可以使用指定的算法执行散列。

第一个散列函数是crypt(),它本身支持几种散列算法。使用此功能时,可以保证您选择的算法可用,因为PHP包含每个支持算法的本机实现,以防系统不支持一个或多个。

第二个散列函数是hash(),它支持比crypt()更多的算法和变体,但不支持crypt()所做的一些算法。 Hash扩展与PHP捆绑在一起,但可以在编译时禁用,因此不保证可用,而crypt()在PHP核心中。

散列密码时使用的建议算法是Blowfish,因为它在计算上比MD5或SHA1贵得多,同时仍然可扩展。

答案 4 :(得分:0)

你应该看一下php的hash()函数:http://se2.php.net/manual/en/function.hash.php

有了这个,你可以使用许多不同的哈希算法,我通常使用sha256,并在哈希之前添加一个盐。

答案 5 :(得分:0)

密码应该经过哈希处理,而不是加密。也就是说,您不应该删除密码。相反,你应该比较哈希。

  1. 用户设置密码$ password ='hX4)1z'
  2. 您获得密码哈希并存储到DB:

    $pw = hash_hmac('sha512', 'salt' . $password, $_SERVER['site_key']); mysql_query('INSERT INTO passwords (pw) VALUES ('$pw');

  3. 客户稍后回来。他们输入了密码,然后对它进行比较:

    mysql_query('SELECT pw FROM passwords WHERE user_id = ?'); //$pw = fetch

    if ($pw == hash_hmac('sha512', 'salt' . $_REQUEST['password'], $_SERVER['site_key']) {

    echo "Logged in";

    if ($pw == hash_hmac('sha512', 'salt' . $_REQUEST['password'], $_SERVER['site_key']) {

  4. 我建议使用带盐的SHA2来存储密码。

    要创建SHA2哈希,请使用:

    echo "Logged in";

    一个salt包含一些额外的字符,可以在散列之前添加到您的密码中以防止彩虹表(密码数据库及其哈希值)。您可以使用唯一的用户信息(如user_id)创建一个,或者只创建一个随机的用户信息并将其存储在某个地方。只要确保盐足够长。

答案 6 :(得分:0)

通常最好不加密密码,而是加密密码。

不同之处在于加密是对字符串进行编码,从而有可能对其进行解码。 散列是“单向的” - 一旦你“散列”某些东西,你就无法对其进行解散。一些字符串可以被散列到相同的结果中,但良好的散列可以减少碰撞的可能性。

最好避免存储实际密码,因为人们倾向于使用单个通用密码来访问多个网站。这意味着您可以访问其他网站上的帐户(或者如果您被泄露,黑客可以)。

将密码字符串与“salt”一起散列是很常见的。这是一些难以猜测的随机字符串,例如&%P)#@ M @#)+!@〜!@ 4320`2#@!$ 0或类似的东西。常见的哈希方法是md5 / sha1(或其他sha方法)。

所以你会:

$password = '....';
$enc_pass = sha1( '%^$sd%MDdF)@I#)3asd3223#@4*^&(*&@#' . $password );

$ enc_pass将存储在数据库中,在登录表单后,将对结果进行哈希处理(如上所述)并与数据库中的值进行比较。

PS:不要忘记让您的数据库列的大小包含整个密码;)

答案 7 :(得分:0)

我想补充一点,存储密码的哈希不会自动使身份验证过程安全。您还应该采用的是一个不错的密码策略。原因是,即使您拥有有史以来最复杂的哈希算法,并且用户使用密码“password”或“1234”,那么该算法也是无用的,因为密码可以简单猜到。

答案 8 :(得分:0)

不要忘记限制密码强度 因为密码强度是整个事情中最薄弱的部分。

只要您的用户使用弱密码,没有盐或额外安全的哈希例程会有任何帮助。

答案 9 :(得分:-2)

您可以使用的最佳散列算法是盐渍MD5散列,您可以在该特定对象的MD5散列字符串中插入一些随机字符。但是你必须记住插入随机字符的位置。这是必需的,以便您可以解密散列以获取原始对象或字符串。

      $random="abcd";
      $hashed=md5(your_string);
      $salted_hash=$hashed.$random;

这是最简单的例子,我刚刚连接了散列和盐。但是你可以在中间的某处插入盐串。