PHP中的动态密码生成[重复]

Posted

技术标签:

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

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

generate_password(); 好不好?

【问题讨论】:

旁注:使用 CRYPT_BLOWFISH 或 PHP 5.5 的 password_hash() 函数存储密码。 您认为什么是强密码?至少16个字符?综合8? 【参考方案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 提到了您生成的密码仅包含每个字符一次。

以上是关于PHP中的动态密码生成[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python 生成动态密码

RSA令牌动态口令生成原理

如何使用 JWT api、用户和密码生成动态授权码

JWT,使用存储在 DB 中的动态密钥

使用 PHP 动态创建站点地图 [重复]

黄聪:OTP动态密码_Java代码实现