PHP Crypt方法中的Western和Unicode字符

时间:2015-10-30 12:42:53

标签: php mysql encryption unicode

我正在使用一种修改密码的简单方法,因此它不会以纯文本格式存储。这是在生产数据库和应用程序上,它一直在运行,直到从Windows Server 2003切换到2012.

private function simpleCrypt($password) {

    $text = strtoupper(trim($password));
    $chars = str_split($text);
    $password2 = '';

    foreach ($chars as $char) {
        $asciivalue = ord($char);


        if ($asciivalue < 128) {
            $newasciivalue = $asciivalue + 128;
            $newchar = chr($newasciivalue);
            $password2 = $password2 . $newchar;

        } elseif ($asciivalue > 128) {

            $newasciivalue = $asciivalue - 128;
            $newchar = chr($newasciivalue);
            $password2 = $password2 . $newchar;

        }
    }


    return $password2;
}

当我的密码通过此脚本运行时,它向我显示 与2003年由其他系统生成的实际编码密码的结果。它显示正确的“西方”字符。如果我使用Firefox并将文本编码更改为西方,但它会向我显示密码的正确数据库表示形式。我已经尝试在登录页面上添加meta到我的标题,认为它会纠正这个但我得到相同的结果。

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

3 个答案:

答案 0 :(得分:1)

尝试

$text = mb_convert_encoding(strtoupper(trim($password)),'iso-8859-1');

答案 1 :(得分:0)

只需返回UTF8即可。

这是完整的脚本。

private function simpleCrypt($password) {

    $text = strtoupper(trim($password));
    $chars = str_split($text);
    $password2 = '';

    foreach ($chars as $char) {
        $asciivalue = ord($char);


        if ($asciivalue < 128) {
            $newasciivalue = $asciivalue + 128;
            $newchar = chr($newasciivalue);
            $password2 = $password2 . $newchar;

        } elseif ($asciivalue > 128) {

            $newasciivalue = $asciivalue - 128;
            $newchar = chr($newasciivalue);
            $password2 = $password2 . $newchar;

        }
    }

    return mb_convert_encoding(($password2), 'utf8');
}

答案 2 :(得分:0)

这些黑色钻石通常来自客户端的非utf8字节,而不是告诉MySQL你有什么编码。

加密应该存储在VARCHAR;而是VARBINARYBLOB

请参阅UTF-8 all the way through