Php 奇怪的字符,如:࿽;在CentOS上使用mcrypt_解密时出现

Php 奇怪的字符,如:࿽;在CentOS上使用mcrypt_解密时出现,php,mysql,database,encryption,character-encoding,Php,Mysql,Database,Encryption,Character Encoding,我想加密访问令牌,并在某个时刻解密它 我的表的内容如下所示: 我以以下方式使用了Mysql AES_ENCRYPT()的内置函数: UPDATE users SET access_token = AES_ENCRYPT('adummyaccesstoken', '1234567890123456') WHERE id = 1; 在WAMP上,我的代码如下所示: try{ $user = "root"; $pass = ""; $dbh = new PDO('mysql

我想加密访问令牌,并在某个时刻解密它

我的表的内容如下所示:

我以以下方式使用了Mysql AES_ENCRYPT()的内置函数:

UPDATE users SET access_token = AES_ENCRYPT('adummyaccesstoken', '1234567890123456') WHERE id = 1;
在WAMP上,我的代码如下所示:

try{
    $user = "root";
    $pass = "";
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
}
catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

$statement = $dbh->prepare("SELECT * FROM `users` WHERE id = 1");
$statement->execute();
$row = $statement->fetch(PDO::FETCH_ASSOC); 

$row['decrypted_token'] = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, '1234567890123456', $row['access_token'], MCRYPT_MODE_ECB));
var_dump($row);
我对运行在CentOS上的Web应用程序应用了相同的方法

$decryptToken = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, '1234567890123456', $this->accessToken, MCRYPT_MODE_ECB));
echo $decryptToken;
结果:

��m�N��kA��%+��q���/��Ĝx��ϐۊ�e  �/+�d�@vU��
问题 我不明白为什么它会以如此奇怪的方式返回代码。我怀疑这与读取解密令牌时的字符集不匹配有关


感谢您的帮助

加密数据是二进制的-它没有字符表示或编码-它不是文本

结果如下:

'access_token' => string 'Äk„
vl¢Þ?ÍØ%tkѲúiLï4]«~Ô‡íW' (length=32) 
可能是iso-8895-1对二进制的解释。请注意二进制数据中的某些内容如何与回车符匹配-这将是
0A
<代码>²=
B2
,依此类推。 如果使用Windows控制台或在记事本中打开文件,您将看到这一点

您在CentOS上看到的结果可能是因为您的终端或编辑器配置为UTF-8。发送到终端的任何字节都被解释为UTF-8。在UTF-8中,7F以上的大多数字节将需要匹配的代理字节,这是一个近乎随机的字符串不会产生的,因此需要替换字符

在数据库中存储二进制数据时,请确保令牌的字段是blob而不是varchar。使用varchar将导致文本字符转换问题


简而言之,您不必担心,因为基础数据是相同的。

加密数据是二进制的-它没有字符表示或编码-它不是文本

结果如下:

'access_token' => string 'Äk„
vl¢Þ?ÍØ%tkѲúiLï4]«~Ô‡íW' (length=32) 
可能是iso-8895-1对二进制的解释。请注意二进制数据中的某些内容如何与回车符匹配-这将是
0A
<代码>²=
B2
,依此类推。 如果使用Windows控制台或在记事本中打开文件,您将看到这一点

您在CentOS上看到的结果可能是因为您的终端或编辑器配置为UTF-8。发送到终端的任何字节都被解释为UTF-8。在UTF-8中,7F以上的大多数字节将需要匹配的代理字节,这是一个近乎随机的字符串不会产生的,因此需要替换字符

在数据库中存储二进制数据时,请确保令牌的字段是blob而不是varchar。使用varchar将导致文本字符转换问题


简而言之,您不必担心,因为基础数据是相同的。

不必通过在访问令牌列中设置
blob
类型来更改表,您仍然可以使用
VARCHAR
,但可以与
base64\u encode()
/
base64\u decode()
组合使用

请看下面的代码:

//Scenario: encrypting
//The value of $encryptedToken needs to be stored in the db
$encryptedToken  = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 'akey', 'anaccesstoken', MCRYPT_MODE_ECB));

//Scenario: decryption
$decryptedToken = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($accessToken), MCRYPT_MODE_ECB));

不必通过将
blob
类型设置为访问令牌列来更改表,您仍然可以使用
VARCHAR
,但可以与
base64\u encode()
/
base64\u decode()
结合使用

请看下面的代码:

//Scenario: encrypting
//The value of $encryptedToken needs to be stored in the db
$encryptedToken  = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 'akey', 'anaccesstoken', MCRYPT_MODE_ECB));

//Scenario: decryption
$decryptedToken = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($accessToken), MCRYPT_MODE_ECB));

您必须使用htmlentity_编码/解码。将编码数据存储在数据库中,并在解码前在浏览器上显示。我尝试了
rtrim()
,但问题仍然是一样的。类似的问题:代码中没有设置数据库连接编码。省去了一些麻烦:不要使用
AES\u ENCRYPT()
并选择一个。您必须使用htmlentity\u encode/decode。将编码数据存储在数据库中,并在解码前在浏览器上显示。我尝试了
rtrim()
,但问题仍然存在。类似的问题:代码中没有设置数据库连接编码。省去了一些麻烦:不要使用
AES\u ENCRYPT()
并选择一个.Super!我在phpmyadmin中将列类型更改为blob,它成功了!尽管我不得不提一件事。修改表之后,为了让它工作,必须再次执行
更新
查询。超级!我在phpmyadmin中将列类型更改为blob,它成功了!尽管我不得不提一件事。修改表之后,为了让它工作,必须再次执行
UPDATE
查询。