【发布时间】:2014-05-14 17:52:57
【问题描述】:
在 php 中如何使用电子邮件、当前时间等生成强密码。它应该至少 45 个字符长度。
generate_password(); 好不好?
【问题讨论】:
-
旁注:使用 CRYPT_BLOWFISH 或 PHP 5.5 的
password_hash()函数存储密码。 -
您认为什么是强密码?至少16个字符?综合8?
在 php 中如何使用电子邮件、当前时间等生成强密码。它应该至少 45 个字符长度。
generate_password(); 好不好?
【问题讨论】:
password_hash() 函数存储密码。
使用 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;
}
【讨论】:
$2a$ 已被 $2y$ 弃用,建议使用 openssl_random_pseudo_bytes() 或类似函数来生成盐。
有很多方法可以做到这一点,但我发现了一种非常简单的方法,可以生成任意长度的强密码。此方法基于 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(),所以我不建议使用它。
mt_rand() 是好的一个。但在整数值上更好。
str_shuffle() 生成密码。如果您的输入字符串每个字符仅包含一次,则生成的密码将仅使用每个字符一次,从而提供非常低的熵值。另外,请注意mt_rand() 对于加密使用也是一个糟糕的选择。请改用openssl_random_pseudo_bytes()。请参阅us2.php.net/manual/en/… 处的注释