【问题标题】:Western and Unicode Characters in PHP Crypt MethodPHP Crypt 方法中的西方和 Unicode 字符
【发布时间】:2015-10-30 12:42:52
【问题描述】:

我正在使用一种简单的方法来修改密码,使其不以纯文本形式存储。这是在生产数据库和应用程序上运行的,直到从 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 http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

【问题讨论】:

    标签: php mysql encryption unicode


    【解决方案1】:

    试试

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

    【讨论】:

    • 结果没有变化。我试着做一个 $newvalue = mb_covert_encoding($password2), 'iso-8859-1');然后返回 $newvalue 认为它会像在浏览器中那样在没有结果的情况下最终将其全部隐藏。
    • 我会选择一些编码选项。当您说它“向您显示结果”时,您是指在浏览器中吗?字符串实际上是什么样子的?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      那些黑色菱形通常来自您的客户端中的非 utf8 字节,并且没有告诉 MySQL 您有什么编码。

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

      UTF-8 all the way through

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-21
        • 2017-02-14
        • 1970-01-01
        • 2013-09-04
        • 2014-06-27
        • 2019-10-02
        • 2017-05-10
        • 2021-01-03
        相关资源
        最近更新 更多