随机字符串生成的字符不是原始字符串

时间:2016-02-05 11:53:14

标签: php random

我使用以下脚本生成临时密码。

之前我得到了一个讲座,我知道这不是加密安全的,我应该使用像openssl_random_pseudo_bytes这样的东西。但我的问题并不是关于“安全”。

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!£$%^&*()?';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
         $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

我使用连接到gmail SMTP的PHPMailer将密码通过电子邮件发送给用户。我遇到的问题是,当我的老板在另一个国家进行了演示时,以下字符作为临时点发送:

New Password: Il%KÂUyÂ?F

注意重音的A不在我的可选字符串中。这只发生过一次,但根本不应该发生。因此,相关的哈希值也没有匹配,因此临时密码不起作用。我使用字段长度为255的password_hash($string, PASSWORD_DEFAULT)

当他测试这个功能时,他在不同国家的事实当然不应该对发送的字符有任何影响,因为它们是从服务器生成的,显然它具有静态位置。

$key = generateRandomString();
$msg.="New Password: ".$key."<br><br>";
$mail->Body = $msg;

1 个答案:

答案 0 :(得分:2)

我自己尝试过,功能完美,所以我认为你的问题是关于编码。

首先确保您的字符串使用

进行UTF-8编码
utf8_encode($key); 

您可以在$ msg和$ key上使用mb_detect_encoding进行检查以确定。
如果您仍有问题,请尝试:

$mail->CharSet = 'UTF-8';  

PHPmailer有时会对编码感到痛苦 希望这会有所帮助:)