2

base64 的问题

$data = 'my data';
echo $encryptedData = base64_encode($data);

// 输出:bXkgZGF0YQ==

我在令牌中添加了更多字符

$encryptedData = $encryptedData . 'sdfsdfasdfsd';
echo $data = base64_decode($encryptedData);

// 输出:我的数据~Ç_jÇ_±

现在我得到了实际数据+垃圾数据。如果令牌有任何变化,我不想要任何数据只想要数据。有什么方法可以实现吗?

4

2 回答 2

2

您应该在编码而不是解码时添加令牌

$data = 'my data'.'sdfsdfasdfsd';
$encryptedData = base64_encode($data);

echo $data = base64_decode($encryptedData);

并删除令牌

$trimmed = rtrim($data, "sdfsdfasdfsd");
echo $trimmed;

键盘

正如 Jon Skeet 所说,base64 绝不是加密。它根本不会使内容保密

于 2012-12-03T07:12:32.217 回答
1

为确保只能通过更改 来更改 base64 编码字符串$data,您需要添加验证令牌。

添加此类验证的一种简单方法是使用密钥散列,其中密钥是秘密的:

$data = 'this product sells for 5 dollars';
$enc = base64_encode($data);
$token = base64_encode(hash_hmac('sha256', $enc, 'your secret key here', true));

$my_token = $token . ':' . $enc;

输出:

ZMkqZIa6UazMhbYDiPqjdS1NmU1ulh+Gi2tgWHRKKpQ=:dGhpcyBwcm9kdWN0IHNlbGxzIGZvciA1IGRvbGxhcnM=

当您收到此类令牌时,您首先拆分:然后使用第一部分(键控哈希)来验证第二部分(数据)的内容。只有匹配,你才能(相对)确定数据没有被篡改。

于 2012-12-03T07:37:30.760 回答