2010-01-25 91 views
4

请在尝试搜索问题前尝试搜索StackOverflow。许多问题已经得到解答。例如:使用哈希安全地存储用户密码

我想,没有人能看到我的密码,即使在数据库..

所以我用散列函数这样

$passowrd_hash=hash('shal',$_POST['password']); 

现在很容易,我可以存储这个password_hash值到数据库中。它会像加密形式一样。

现在用户知道它的原始密码,他不知道这个加密的密码。

现在,如果他尝试通过此原始密码登录..他无法登录。

那么有什么方法可以解密,用户可以登录。所以他既可以实现密码安全,又可以再次登录。

如何做到这一点?

+4

当你喜欢其中一个答案,请标记为接受 – tanascius 2010-01-25 14:30:33

+0

要求,并经常在这里找到答案。 C. – symcbean 2010-01-25 14:31:56

+0

tanascius,您的链接已损坏。 – 2010-01-25 14:39:01

回答

13

您需要散列用户输入密码并比较散列。

1

您只需要加密输入的密码并比较两者;数据库中的散列和您刚刚加密的散列。如果它们匹配,那么输入的密码是正确的。我假设你正在使用像SHA1这样的算法。

+0

至少,很有可能 – Martijn 2010-01-25 14:30:57

1

将用户发布的密码与数据库中的密码进行比较之前,以与存储的密码相同的方式加密发布的密码。

1

你不需要解密它。您不能将散列转换为纯文本,即单向函数。所以,基本上你哈希输入的密码,并比较两个散列:

E.g (pseudo code):- 

if hash(password entered by user) == password stored in databse Then 
    //logged in successfully 
else 
    //login failed 
end if 
+0

你的if语句的后半部分应该是'存储在数据库中的散列密码'。当然,在任何地方存储未加密的密码都是不安全的。 – 2010-01-25 14:38:06

+0

我同意....改变了代码以反映它....谢谢 – Bhaskar 2010-01-25 14:41:33

0

我强烈建议使用MD5()http://php.net/manual/en/function.md5.php

当用户注册,您存储:

$password = md5($_POST['password']); 

而当你的用户登录查询:

if($_POST['password_entered'] == $passwordFromDB) : 
    // Log user in 
else : 
    // Show error to user 
endif; 
+0

我会认为使用sha1()会更安全吗? – Elliott 2010-01-25 14:47:58

+0

MD5已损坏,不应用于加密目的 – 2010-01-25 14:47:58

1

前面已经回答了,你需要在每次他们再一次哈希密码输入它并将散列与数据库中的内容进行比较。

你也应该看看你的哈希算法中使用salt。还有就是在讨论这个问题的一个很好的协议:

Secure hash and salt for PHP passwords