关于php:在存储到数据库之前加密密码?

Encrypt password before storing in database?

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

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

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

如何在它插入到数据库之前对其进行加密?我读过一些关于不同技术的文章,但是我在寻找最好的方法来管理它。

谢谢大家。


虽然下面的答案在技术上仍然是正确的,但是对于要使用的散列算法,PHP有新的建议。从php>=5.5.0开始,他们的建议是使用password_hashpassword_verify函数散列和验证散列密码。作为一个额外的好处,这些函数自动包含一个单独化的salt作为返回散列的一部分,因此您不需要显式地担心这一点。


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

有一件事,要使它更安全一点,就是在散列中添加一个salt,然后再次运行散列函数。这使得恶意生成密码散列更加困难,因为salt值只在服务器端处理。例子:
$pass = sha1(sha1($_REQUEST['pass']).sha1("mySalt@$#(%"));


使用PHP的密码库。MD5不是加密,它是散列。

另外,在密码上撒盐。为什么?

  • 这个答案
  • 另一个好答案


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$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可以确保彩虹表是无用的,任何闯入您的服务器的人都必须对每个密码进行暴力破解。


在地窖里加点盐。如

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

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

如http://www.ibm.com/developerworks/opensource/library/os-php-encrypt所示/


最基本的:用md5或sha1散列它

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

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

最近我也开始存储用户名哈希,所以登录尝试是安全的,只使用哈希数据进行比较。

你可以用额外的数据"盐"散列,所以如果它们被破坏了,就找不到它的值(尝试搜索一些简单的散列词)。也就是说,使用一个站点范围的字符串来更改标准散列,如md5("mySiteSalt!!" . $_REQUEST['pass']);或更高级的散列。


为了找出MD5,Sha1和他们的快速朋友可能不是一个好主意,你应该阅读彩虹表足够多的帖子:你需要知道的关于安全密码方案的托马斯普塔切克。要点:

Finally, we learned that if we want to
store passwords securely we have three
reasonable options: PHK’s MD5 scheme,
Provos-Maziere’s Bcrypt scheme, and
SRP. We learned that the correct
choice is Bcrypt.

注意:是phk,不是php。


您应该使用sha1来散列密码以便存储在数据库中。这是存储密码最简单但最有效的方法:

1
$password = sha1($password);

它也非常安全。虽然它的完整性开始蔓延,但将该功能升级到sha-256(这是非常安全的)相当容易。