Php 奇怪的字符,如:;在CentOS上使用mcrypt_解密时出现
我想加密访问令牌,并在某个时刻解密它 我的表的内容如下所示: 我以以下方式使用了Mysql AES_ENCRYPT()的内置函数: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
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
查询。