这个密码可以更安全吗?

时间:2011-11-04 23:42:35

标签: php mysql

如何使密码更安全,我目前的代码是:

<?php

if(!empty($_POST['userPass']))
    #secure pass
    $newRequesterPass = mysql_real_escape_string($_POST['userPass']);
    $static_salt = 'M0AaE|}{<}|{&*@^AhEQ'; 
    $dynamic_salt = mt_rand(); 
    $newRequesterPass = sha1($dynamic_salt . $newRequesterPass . $static_salt);

?>

有没有办法让这个更安全,而不会牺牲大量资源?

喜欢通过SHA512或其他方法吗?

5 个答案:

答案 0 :(得分:2)

您可以将算法更改为使用SHA512或Blowfish。

请参阅http://php.net/manual/en/function.crypt.php

您还可以在创建帐户(或更新密码)时为每个用户生成一个唯一的盐,这样可以在发现盐时限制单个帐户的风险。

答案 1 :(得分:1)

使用hash_hmac比普通散列(md5 / sha等)更好。

http://php.net/manual/en/function.hash-hmac.php

虽然我不明白你对$ dynamic_salt的使用。如果每次都生成一个新盐,它将如何与数据库中的密码匹配。

...

好的,所以如果按用户存储动态盐......

$newRequesterPass = hash_hmac('sha256', $newRequesterPass, $dynamic_salt.$static_salt);

答案 2 :(得分:1)

除了使用更强哈希的优秀建议之外,安全密码管理涉及的管理代码不仅仅是以盐渍+哈希形式存储密码。您做多少这取决于您的应用程序的业务需求,但请考虑以下因素:

  1. 密码验证 - 您可能希望强制执行某些字符(例如字母+数字,大写+小写等。

  2. 多个哈希 - 例如哈希密码1000次 - 好的,这可能违反了你的“不是很多资源”的条件:)

  3. 到期 - 密码应设置为在某个时间(例如1年)到期,以便您在成功登录后立即警告用户更改密码(例如10个月)。

  4. 频道处理 - 显然密码应该通过SSL频道发送,而不是透明。不要依赖客户端javascript来保护密码。但是你应该做的不仅仅是通过https发布密码,整个登录顺序需要用https进行。

  5. 忘记密码政策。请勿通过电子邮件以明文形式向他们发送密码。向他们发送重置密码的链接并使用离线确认频道(例如,发送后续电子邮件通知他们密码已更改)。

  6. 看看https://www.owasp.org/index.php/Forgot_Password_Cheat_Sheet

    更新:为了清楚起见,不要尝试使用自己的工具进行会话管理或密码散列。除非您是真正的专家,否则请使用标准工具。

答案 3 :(得分:0)

md5() - 计算字符串的md5哈希值

hash() - 生成哈希值(消息摘要)

uniqid() - 生成唯一ID

补充:

sha1() - 计算字符串的sha1哈希

只需看http://php.net/manual/en/function.crypt.php

即可

答案 4 :(得分:0)

你在那里看到的只是“默默无闻的安全” - 一种创建密码哈希的非常复杂的方式。

如果您对人们破坏数据库和破解哈希感到困扰,您应该使用bcrypt。

如果你不是,那么使用标准的东西(md5很受欢迎) - 这只能提供表面防止破解的保护。

请注意,有人需要妥协您的数据库才能以这种方式进行字典或暴力攻击。

强烈建议您不要自己“发明”加密算法,要使它们正确(或者至少使它们安全)是非常困难的。