我正在使用一种修改密码的简单方法,因此它不会以纯文本格式存储。这是在生产数据库和应用程序上,它一直在运行,直到从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">
答案 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
;而是VARBINARY
或BLOB
。