Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP加密方法中的西文字符和Unicode字符_Php_Mysql_Encryption_Unicode - Fatal编程技术网

PHP加密方法中的西文字符和Unicode字符

PHP加密方法中的西文字符和Unicode字符,php,mysql,encryption,unicode,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)

我正在使用一种简单的方法修改密码,这样它就不会以纯文本形式存储。这是在一个生产数据库和应用程序上,它一直工作到从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;
}
当我的密码通过这个脚本运行时,它会显示�� vs其他系统在2003年生成的实际编码密码。它显示正确的西文字符。如果我使用Firefox并将文本编码更改为western,那么它会显示密码的正确数据库表示形式。我曾尝试在登录页面的标题中添加meta,认为这样可以纠正这个问题,但我得到了相同的结果

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


只需要返回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');
}

这些黑钻石通常来自于客户端中有非utf8字节,并且没有告诉MySQL您有什么编码

加密不应存储在VARCHAR中;更确切地说是二进制或二进制


请参见

结果无变化。我试着用$newvalue=mb_covert_编码$password2,'iso-8859-1';然后返回$newvalue,认为它最终会像在浏览器中一样隐藏所有内容,但不会产生任何结果。当你说它显示一个结果时,你的意思是在浏览器中?这根绳子实际上是什么样子的?
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');
}