在存储到数据库之前加密密码?

时间:2010-10-20 19:40:12

标签: php mysql password-protection

我的密码通过php脚本user.php从我的iPhone应用程序传递到数据库。

变量$ pass由以下内容填充:

$pass = str_replace("'", "", $_REQUEST['pass']);

如何在插入数据库之前对其进行加密?我已经阅读了一些关于不同技术的内容,但寻找管理它的最佳方法。

感谢大家。

7 个答案:

答案 0 :(得分:7)

使用php的crypt库。 Md5不是加密,而是散列。

另外,加密你的密码。 Why?

答案 1 :(得分:7)

虽然下面的答案在技术上仍然正确,但php有关于要使用的散列算法的新建议。 Their recommendation,从php> = 5.5.0开始,是使用password_hashpassword_verify函数来散列和验证散列密码。作为额外的好处,这些函数会自动将个性化的salt作为返回哈希的一部分,因此您无需明确担心。

<小时/> 如果您不关心检索实际密码的值(来自数据库加密值),则可以在其上运行单向散列算法(例如sha1)。此函数将返回特定长度的字符串(哈希),该字符串不能用于查找原始字符串(理论上)。两个不同的字符串可能会创建相同的哈希值(称为冲突),但这不应该是密码的问题 示例: $pass = sha1($_REQUEST['pass']);

有一点,为了使其更安全,可以在哈希中添加一个盐并再次运行哈希函数。这使得恶意生成密码哈希变得更加困难,因为盐值仅在服务器端处理 示例: $pass = sha1(sha1($_REQUEST['pass']).sha1("mySalt@$#(%"));

答案 2 :(得分:2)

首先,您应该创建一个随机用户salt。然后你应该将它和密码哈希存储在数据库中。

$salt = md5(unique_id().mt_rand().microtime());
$pass = sha1($salt.$_REQUEST['pass']);

并保存数据库中的$ salt和$ pass。然后,当他们去登录时,你查找他们的行并检查哈希:

$user = query('SELECT * FROM `user` WHERE username = ?', array($_REQUEST['username']));

if($user)
{
    // If the password they give maches
    if($user->pass === sha1($user->salt. $_REQUEST['pass']))
    {
        // login
    }
    else
    {
        // bad password
    }
}
else
{
    // user not found
}

为每个帐户创建一个用户salt可确保彩虹表无用,任何闯入服务器的人都必须强制使用每个密码。

答案 3 :(得分:1)

最基本的:用MD5或SHA1

哈希
$newpass = md5($_REQUEST['pass']);

$newpass = sha1($_REQUEST['pass']);

最近我开始存储用户名哈希值,因此只使用散列数据进行比较,登录尝试是安全的。

你可以用额外的数据“加盐”哈希值,所以如果它们被泄露,就找不到它的值(尝试用谷歌搜索一些简单的哈希词)...即使用一个站点范围的字符串来改变标准哈希值,如{{ 1}}或更高级的东西。

答案 4 :(得分:1)

使用crypt加盐。如

$user = strip_tags(substr($_REQUEST['user'],0,32));
$plain_pw = strip_tags(substr($_REQUEST['pass'],0,32));

$password = crypt(md5($plain_pw),md5($user));

on http://www.ibm.com/developerworks/opensource/library/os-php-encrypt/

答案 5 :(得分:0)

您应该使用SHA1哈希密码以存储在数据库中。这是存储密码的最简单但最有效的方法:

$password = sha1($password);

它也非常安全。虽然它的完整性已经开始蔓延,但将此功能升级到SHA-256(非常安全)非常容易。

答案 6 :(得分:0)

要了解为什么md5,sha1及其快速的朋友可能不是一个好主意,您应该阅读Thomas Ptacek的帖子Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes。要点:

  

最后,我们了解到,如果我们愿意的话   安全存储密码我们有三个   合理的选择:PHK的MD5方案,   Provos-Maziere的Bcrypt计划,以及   SRP。我们了解到正确的   选择是Bcrypt。

注意:它是PHK,而不是php。