PHP加密方法中的西文字符和Unicode字符
我正在使用一种简单的方法修改密码,这样它就不会以纯文本形式存储。这是在一个生产数据库和应用程序上,它一直工作到从Windows Server 2003切换到2012PHP加密方法中的西文字符和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)
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');
}