将用户密码与存储在DB中的散列密码相匹配

时间:2014-08-19 09:41:02

标签: php

有人应该指导我如何从数据库中取出哈希密码并匹配用户在登录时输入的密码 我使用php crypt()函数和bcrypt算法在注册用户时散列密码 谢谢大家提前

4 个答案:

答案 0 :(得分:0)

您只需将未加密的密码发送到与加密密码相同的加密过程,然后它们就应该匹配。

PHP已内置选项来执行此操作,请查看Creating a HashVerifying a Hash

伪代码

  • 哈希密码= hp
  • 纯文本密码= p
  • seed(服务器生成的随机数)= s
  • 哈希算法(md5,sha1,sha256,...)= hash

示例 种子哈希

hp = hash(p + s)

您设置种子的顺序并不重要,只要您每次都以相同的方式执行,通过连接密码和种子

示例没有种子哈希

hp = hash(p)

您需要保存 hp 种子,p不应该被服务器保存,因为纯文本密码是一个安全问题。

C#代码示例:

    static public bool IsPasswordCorrect(string hp, string seed, string enteredPasword)
    {
        return (hp == Sha1(String.Concat(enteredPasword, seed)));
    }

这样您无法直接从数据库中获取密码,只有实际的客户端才能拥有明文密码。

如果你想要一个双向加密算法,你需要看一下RSA,但它更复杂,需要大量的知识来保证安全。

答案 1 :(得分:0)

您不需要从数据库中“获取”哈希,只需散列给定的密码(从我假设的登录尝试),并将THAT哈希与数据库的密码列匹配。如果找到匹配密码列与您刚刚创建的哈希匹配且用户名匹配的匹配项,则密码有效。

答案 2 :(得分:0)

来自documentation

$hashed_password = crypt('mypassword'); // let the salt be automatically generated
if (crypt($user_input, $hashed_password) == $hashed_password) {
   echo "Password verified!";
}

您需要传入原始哈希值,否则crypt将生成随机盐并且密码不太可能匹配。即。

//BROKEN - will almost always print "Bugger off!".
$hash = crypt('Hello world');
$attempt = crypt('Hello world');
if($hash === $attempt){
    echo "Access granted!";
}else{
    echo "Bugger off!";
}

答案 3 :(得分:0)

谢谢大家,如果我真的得到你的解释,你的意思是我应该从试图登录的用户散列即将到来的密码,然后将哈希值与数据库中的哈希值进行比较 例 $ salt = // bcrypt算法格式,成本参数和盐在这里,与registrian时使用的相同

$ coming_pass = crypt($ password,$ salt)

mysqli_query(用户WHERE用户名= $ username AND 密码= $ coming_pass)