我想加密访问令牌,并在某些时候解密它。
我以下列方式使用了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);
在WAMP上,结果如下:
array (size=5)
'id' => string '1' (length=1)
'firstname' => string 'Pim' (length=3)
'lastname' => string 'van der Wal' (length=11)
'access_token' => string 'Äk„
vl¢Þ?ÍØ%tkѲúiLï4]«~Ô‡íW' (length=32)
'decrypted_token' => string 'adummyaccesstoken' (length=32)
我将相同的方法应用于在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��
问题 我无法理解为什么它以这种奇怪的方式返回代码。我怀疑这与读取解密令牌时字符集不匹配有关。
感谢任何帮助。
答案 0 :(得分:4)
加密数据是二进制的 - 它没有字符表示或编码 - 它不是文字
结果显示在这里:
'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会导致文本字符转换问题。
简而言之,您不必担心底层数据是相同的。
答案 1 :(得分:1)
不是通过将blob
类型设置为访问令牌列来更改表格,而是仍然可以使用VARCHAR
,但与base64_encode()
/ base64_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));