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中的动态密码生成[重复]的主要内容,如果未能解决你的问题,请参考以下文章