【问题标题】:Dynamic password generation in PHP [duplicate]PHP中的动态密码生成[重复]
【发布时间】:2014-05-14 17:52:57
【问题描述】:

在 php 中如何使用电子邮件、当前时间等生成强密码。它应该至少 45 个字符长度。

generate_password(); 好不好?

【问题讨论】:

  • 旁注:使用 CRYPT_BLOWFISH 或 PHP 5.5 的 password_hash() 函数存储密码。
  • 您认为什么是强密码?至少16个字符?综合8?

标签: php cakephp


【解决方案1】:

使用 php 内置的 password_hash()。除非您是专家,否则不要使用自己的密码哈希。

更多信息见:

http://www.php.net/manual/en/function.password-hash.php

如果你绝对必须自己动手(或者你在 windows 上并且需要与 windows php 兼容的东西),请使用 crypt 的一些变体,比如我在 windows 上用于开发的东西:

function generateHash($plainText, $encdata = false) 
{ 
    $strength = "08"; 
    //if encrypted data is passed, check it against input
    if ($encdata) { 
        if (substr($encdata, 0, 60) == crypt($plainText, "$2a$".$strength."$".substr($encdata, 60))) { 
          return true; 
        } else { 
          return false; 
        } 
    } else {     
        //make a salt and hash it with input, and add salt to end 
        $salt = ""; 
        for ($i = 0; $i < 22; $i++) { 
        $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
        } 
        //return 82 char string (60 char hash & 22 char salt) 
        return crypt($plainText, "$2a$".$strength."$".$salt).$salt; 
    } 
} 

使用它相当简单。

对密码进行哈希处理

generateHash($password);

根据哈希值检查密码(例如用户在数据库中存储的哈希值)

generateHash($password,$storedhash);

编辑生成随机密码试试这个:

function generateString() {
    $string = "";
    for($i=0; $i < 44; $i++) {
        $x = mt_rand(0, 3);
        switch($x) {
            case 0: $string.= chr(mt_rand(97,102));break;
            case 1: $string.= chr(mt_rand(65,90));break;
            case 2: $string.= chr(mt_rand(48,57));break;
            case 3: $string.= chr(mt_rand(103,122));break;
        }
    }
    return $string;

}

【讨论】:

  • 我认为 OP 想要生成密码,而不是密码哈希 :)
  • 另外,$2a$ 已被 $2y$ 弃用,建议使用 openssl_random_pseudo_bytes() 或类似函数来生成盐。
  • 你不能在 windows 上使用 openssl。它会导致脚本一直执行,直到达到最大执行时间(或者我上次检查时确实如此)。
  • 那么你的安装就失败了,OpenSSL 在 Windows 上运行良好。
【解决方案2】:

有很多方法可以做到这一点,但我发现了一种非常简单的方法,可以生成任意长度的强密码。此方法基于 str_shuffle() 函数,该函数随机打乱字符串。

<?
    function generate_password( $length = 8 ) {
       $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?";
       $password = substr( str_shuffle( $chars ), 0, $length );
       return $password;
    }
?>

要生成随机密码,只需在此函数中传递所需长度的密码。如果省略长度参数,则默认生成 8 个字符长的密码。

$password1 = generate_password(); // default length 8
$password2 = generate_password(6); // 6 character long password

generate_password() 很简单,但是, 如果您想使用强密码,请尝试使用哈希算法。

您可以在哈希中添加一个键,并随查询一起发送时间戳,例如:

$time = time();
$hash = md5($key . $time);

你也可以使用hash_hmac():more detail LINK

$password = hash_hmac('sha256', $username . time(), 'secret');

【讨论】:

  • str_shuffle() 在内部使用rand(),所以我不建议使用它。
  • 你也用这个 bt 也 mt_rand() 是好的一个。但在整数值上更好。
  • 不要使用str_shuffle() 生成密码。如果您的输入字符串每个字符仅包含一次,则生成的密码将仅使用每个字符一次,从而提供非常低的熵值。另外,请注意mt_rand() 对于加密使用也是一个糟糕的选择。请改用openssl_random_pseudo_bytes()。请参阅us2.php.net/manual/en/… 处的注释
  • 您的 $chars 包含元音。如果您不删除元音,那么您的密码将包含挑剔的单词和短语以及诅咒词。另外,您说这是“强”。这不是一个“强”密码,因为@QuinnComendant 提到了您生成的密码仅包含每个字符一次。
猜你喜欢
  • 2019-05-25
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2011-09-23
  • 2011-04-03
  • 2014-03-27
  • 2012-06-03
  • 1970-01-01
相关资源
最近更新 更多