2010-10-20 109 views
6

我有一个密码从我的iPhone应用程序通过php脚本user.php传递给数据库。在存入数据库之前加密密码?

变量$传球被填充如下:

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

我怎样才能加密此它插入到我的数据库之前?我读了一些关于不同的技术,但寻找最好的方法来管理这个。

感谢大家。

+0

无关:使用正确的输入逃逸,不靠'str_replace'过滤掉所有引号 – knittl 2010-10-20 20:46:17

+0

它是从一个iPhone应用程序来,通过URL传递给脚本。 – BigMike 2010-10-20 20:50:33

+0

另见的OpenWall的[便携式PHP的密码哈希框架(http://www.openwall.com/phpass/)(PHPass)。它强化了对用户密码的一些常见攻击。 – jww 2014-10-11 23:34:57

回答

6

如果你不关心检索的实际密码的值(从数据库加密后的值),你可以在它上面运行单向散列算法(如sha1:http://php.net/manual/en/function.sha1.php)。该函数将返回一个特定长度的字符串(散列),它不能用于查找原始字符串(理论上)。有可能两个不同的字符串可以创建相同的散列(称为冲突),但这不应该是密码问题。
例子: $pass = sha1($_REQUEST['pass']);

一件事,让它多一点安全是盐添加到哈希并再次运行哈希函数。这使得恶意地生成密码哈希变得更加困难,因为盐值仅在服务器端处理。
例子: ​​

+1

这不是一个合适的盐。盐对于应用程序的每个用户都不相同。相反,它是用户特定的。 – middus 2010-10-20 20:19:42

+0

我用过这个。它正在工作,并不需要超级神秘。 – BigMike 2010-10-20 20:45:06

1

的最基本的:用MD5或SHA-1

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

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

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

你可以用额外的数据“散布”哈希,所以如果它们被破坏,它的价值无法找到(尝试使用谷歌搜索一些简单的散列字)..即使用一个站点范围的字符串只是为了改变标准哈希,如md5("mySiteSalt!!" . $_REQUEST['pass']);或更先进的东西。

+2

md5不适用于加密。 – Chris 2010-10-20 19:44:04

+1

@Chris为了记录,哈希是一种加密形式(尽管是单向的)。无论如何,MD5不应该被用来存储密码。有了今天的彩虹表,它和明文一样好。 – mattbasta 2010-10-20 19:47:58

+0

永远不要说哈希不是一种加密的形式,我只是说md5不是用于加密的。那么为什么你建议使用md5来“加密”OP的密码。在使用md5进行密码加密创建另一个具有复杂安全感的用户之前,至少要解释您的答案。 – Chris 2010-10-20 19:48:55

0

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

$password = sha1($password); 

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

+0

SHA1太快。请参阅我答案中的链接。 – middus 2010-10-20 20:25:22

+0

@middus它肯定是太快了,但它比MD5使用的空间多30%,所以至少表格要大一些。另外,如果某人有足够的权限访问数据库来收集哈希密码,他们很可能会窃取大量其他未加密的信息。 SHA1不是“很好”,但它会在95%的情况下完成。 – mattbasta 2010-10-20 21:21:53

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。

2

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

$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 
} 

创建为每个帐户确保彩虹表是无用的,任何人闯入你的服务器的用户盐会有暴力破解每个密码。

相关问题