PHP:SHA506强制使用utf8

时间:2017-08-11 07:00:11

标签: php utf-8 sha256

这是我的PHP问题:对于与Postfinance集成的E-Payement,我需要验证数据的发送和收到的所有字段的SHA256哈希值,每个字段之间都有一个密钥。

如何在散列之前确定输入字符串是否为UTF8?

命令utf8_encode()用于输入字符串,如果我用mb_check_encoding()检查,它没问题,我有良好的响应,如果我使用mb_detect_encoding(),响应是&# 34; ASCII"

$pf_post=array();

$pf_post['AMOUNT']=100;
$pf_post['CURRENCY']="CHF";
$pf_post['ORDERID']=101;
$pf_post['TITLE']="Paiement";

$pf_key="mytestkey";

foreach (array_keys($pf_post) as $lakey)
{
$pf_string.=strtoupper($lakey)."=".strval($pf_post[$lakey]).$pf_key;
}

$pf_string=utf8_encode($pf_string);
$pf_sign=hash('sha256',$pf_string);

if (mb_check_encoding($pf_string, 'UTF-8')) {
    $debug.="STRING => Détection UTF8 OK !<br>";
} else {
    $debug.="STRING => Détection UTF8 !!! ERREUR !!!<br>";
}

if (mb_check_encoding($pf_sign, 'UTF-8')) {
    $debug.="HASH => Détection UTF8 OK !<br>";
} else {
    $debug.="HASH => Détection UTF8 !!! ERREUR !!!<br>";
}

$debug.="String Format : ".mb_detect_encoding($pf_string).", Hash Format : ".mb_detect_encoding($pf_sign)."<br>";

这是调试:

STRING => Détection UTF8 OK !
HASH => Détection UTF8 OK !
String Format : ASCII, Hash Format : ASCII

如果我只使用字段中的数字,那就没问题......如果我使用字母,那么每次都不会好......而且如果使用带重音的字母......随时都会出错!

在HTML标题中,我有:

<meta charset="utf-8"/>

请帮帮我!谢谢!

2 个答案:

答案 0 :(得分:0)

以下是一些例子:

$str="éóùùééééè"; // will output 'éóùùééééè'
$strr =utf8_encode($str); // will output 'éóùùééééè'

如果你申请UTF-8字符串,utf8_encode()将返回一个乱码的UTF8输出,如例子所示。

为了确保您使用的是UTF-8,在每个脚本的顶部使用mb_internal_encoding('UTF-8'),您可以使用此forceutf8类。链接https://github.com/neitanod/forceutf8

<?php
// Tell PHP that we're using UTF-8 strings until the end of the script
mb_internal_encoding('UTF-8');

include('Encoding.php'); //the class from github

//same strings
$str = 'éóùùééééè';
$str1 = 'éóùùééééè'; //garbled UTF8 of éóùùééééè 

//force input to utf8
use \ForceUTF8\Encoding;
echo Encoding::fixUTF8($str).'</br>'; // will output éóùùééééè
echo Encoding::fixUTF8($str1).'</br>'; // will output éóùùééééè

$str3 = Encoding::fixUTF8($str);
$str4 = Encoding::fixUTF8($str1);


//Then hash
$hash1 = hash('sha256', $str3);
$hash1 = hash('sha256', $str4);

echo $hash1; // will output 45b8151559a5136d58f85ebf51c24f26c47e51f4a89fe2962c8626e99ad64786
echo $hash2; // will output 45b8151559a5136d58f85ebf51c24f26c47e51f4a89fe2962c8626e99ad64786

//mb_detect_encoding will ouput always ASCII
echo  mb_detect_encoding($hash1). '</br>'; // will output ASCII
echo  mb_detect_encoding($hash1); //// will output ASCII

在浏览器级别,您需要:

<meta charset="UTF-8">

答案 1 :(得分:0)

您不应该将值编码为utf8两次。我建议只在真的有必要时进行编码。例如:

if (!mb_check_encoding($pf_string, 'UTF-8')) {
    $pf_string = mb_convert_encoding($pf_string, 'UTF-8');
}