PHP crypt()函数的salt参数和返回值如何工作?

通常如果我有密码,我会使用这个伪代码:</ p>

   $ password =“这是用户的密码”; 
/ *** /
$ salt = GenerateSalt();
$ hash = Hash($ password);
$ hash = Hash($ hash 。$ salt);
</ code> </ pre>

但是,正如我所理解的那样,PHP有一个 crypt()</ code>函数,它可以获取盐和 特定算法的迭代次数。 显然你是......应该将 crypt </ code> 的返回哈希值作为salt传递回</ em> crypt </ code>。 我不明白这一点。</ p>

任何人都可以澄清一下如何工作? 我是否还需要添加自己的盐并重新加入? 在这种情况下,我是否只使用固定的salt作为crypt,然后为每个用户生成一个单独的crypt? 或者crypt的 $ salt </ code>参数会为我处理这个问题吗?</ p>
</ div>

展开原文

原文

Normally if I have a password, I would use this pseudocode:

$password = "this is the user's password";
/***/
$salt = GenerateSalt();
$hash = Hash($password);
$hash = Hash($hash . $salt);

However, as I understand it, PHP has a crypt() function which takes a salt as well as the number of iterations of a particular algorithm. Apparently you are.. supposed to pass the returned hash of crypt back into crypt as the salt. I do not understand this.

Can anyone please clarify how crypt works? Do I still need to append my own salt and rehash? In that case, would I just use a fixed salt for crypt, and then generate a separate crypt for each user? Or does crypt's $salt parameter take care of that for me?

dongyou2635
dongyou2635 另请注意,在PHP5.3.7forMD5中,crypt已被破坏。他们刚刚发布了bugfix5.3.8
大约 9 年之前 回复
duanbushi1479
duanbushi1479 请注意,PHP的crypt应该不适合在5.3版之前使用。您总是希望使用$2a$,$5$或$6$前缀分别获得Blowfish,SHA-256或SHA-512,并且不保证在早期版本中提供这些前缀。请阅读手册页以获取更多详细信息。
大约 9 年之前 回复

2个回答



crypt </ code>的输出包括:</ p>


    < li>(可选择算法标识符+加载因子)</ li>
  • 所用算法的salt </ li>
  • 实际哈希</ li>
    </ ul>

    当您将此输出als“salt”传递回 crypt </ code>时,它将提取正确的算法和salt,并将其用于操作。 如果只提到一个算法,它会使用这个算法并生成随机盐。 否则,它将选择默认算法并生成随机盐。 传递的salt参数中的 hash </ code>部分将被忽略。</ p>

    因此,您可以简单地将stored_hash与crypt(password,stored_hash)进行比较 - 如果它相等,则 很可能是正确的密码。</ p>

    这是一个伪代码解释(用类似PHP的语法)如何工作:</ p>

      function crypt  ($ password,$ salt)
    {
    if(substr($ salt,0 1)==“_”){
    $ count = substr($ salt,1,4);
    $ real_salt = substr ($ salt,5,4);
    返回“_”。 $ count。 $ real_salt。 crypt_ext_des($ password,$ count,$ salt);
    }
    if(substr($ salt,0,3)==“$ 1 $”){
    list($ ignored,$ real_salt,$ ignored)= 爆炸(“$”,$ salt);
    返回“$ 1 $”。 $ real_salt。 “$”。 crypt_md5($ password,$ real_salt);
    }
    if(substr($ salt,0,4)==“$ 2a $”){
    $ cost = substr($ salt,4,2); \ n $ real_salt = substr($ salt,7,22);
    返回“$ 2a $”。 $ cost。 “$”。 $ real_salt。 crypt_brypt($ password,$ real_salt,$ cost);
    }
    // ... SHA256和SHA512类似物

    // no match =&gt; STD_DES
    $ real_salt = substr($ salt,0,2);
    返回$ real_salt。 crypt_std_des($ password,$ real_salt);
    }
    </ code> </ pre>

    然后,各个crypt_xxx函数执行实际工作,具体取决于算法。

    (实际上, 在这个描述中缺少随机盐的生成。如果$ real_salt为空,将会完成。)</ p>
    </ div>

展开原文

原文

The output of crypt consists of:

  • (optionally an algorithm identifier + load factor)
  • the salt for the used algorithm
  • the real hash

When you pass this output als "salt" back to crypt, it will extract the right algorithm and salt, and use these for the operation. If there is only an algorithm mentioned, it uses this one and generate random salt. Otherwise it will choose a default algorithm and generate random salt. The hash part in the passed salt parameter is ignored.

So you can simply compare your stored_hash with crypt(password, stored_hash) - if it is equal, it quite likely was the right password.

Here is an pseudocode explanation (in PHP-like syntax) how crypt works:

function crypt($password, $salt)
{
  if (substr($salt,0 1) == "_") {
     $count = substr($salt, 1, 4);
     $real_salt = substr($salt, 5, 4);
     return "_" . $count . $real_salt . crypt_ext_des($password, $count, $salt);
  }
  if(substr($salt, 0, 3) == "$1$") {
     list($ignored, $real_salt, $ignored) = explode("$", $salt);
     return "$1$" . $real_salt . "$" . crypt_md5($password, $real_salt);
  }
  if(substr($salt, 0, 4) == "$2a$") {
      $cost = substr($salt, 4, 2);
      $real_salt = substr($salt, 7, 22);
      return "$2a$" . $cost . "$" . $real_salt . crypt_brypt($password, $real_salt, $cost);
  }
  // ... SHA256 and SHA512 analogons

  // no match => STD_DES
  $real_salt = substr($salt, 0, 2);
  return $real_salt . crypt_std_des($password, $real_salt);
}

The individual crypt_xxx functions then do the real work, depending on the algorithm. (Actually, the generation of random salt is missing in this description. It will be done if the $real_salt is empty.)

doushu9253
doushu9253 所有算法标识符,salt和hash。 是的,您将整个返回值作为一个varchar值存储在数据库中。
大约 9 年之前 回复
dongmu5815
dongmu5815 所以返回的“hash”实际上既是salt又是hash,通常在MySQL数据库中,我只将它存储为一个值?
大约 9 年之前 回复



crypt是单向散列,如MD5 </ p>

像手册中所述使用它</ p>

 &lt;?php 
$ password = crypt('mypassword'); //让盐自动生成

/ 你应该传递crypt()的整个结果作为比较密码的盐,以避免在使用不同的哈希算法时出现问题。 (如上所述,标准的基于DES的密码散列使用2个字符的盐,
但基于MD5的散列使用12。)
/
if(crypt($ user_input,$ password)== $ password) {
echo“密码已验证!”;
}
?&gt;
</ code> </ pre>
</ div>

展开原文

原文

crypt is one-way hashing, like MD5

Use it like stated in manual

<?php
$password = crypt('mypassword'); // let the salt be automatically generated

/* You should pass the entire results of crypt() as the salt for comparing a
   password, to avoid problems when different hashing algorithms are used. (As
   it says above, standard DES-based password hashing uses a 2-character salt,
   but MD5-based hashing uses 12.) */
if (crypt($user_input, $password) == $password) {
   echo "Password verified!";
}
?>

dourukeng5302
dourukeng5302 crypt('mypassword')创建salt,而不是密码。
大约 9 年之前 回复
drvc63490
drvc63490 这完全是我的问题。 if(crypt($ user_input,$ password)== $ password)对我来说真的没有意义。 为什么你传递$密码,这是哈希,作为盐?
大约 9 年之前 回复
立即提问
相关内容推荐