2012-12-03 46 views
2

問題使用Base64改造需要的base64

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

//輸出: bXkgZGF0YQ ==

我增加了一些更多的字符令牌

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

//輸出: 我數據Ç_j±

現在我得到了實際的數據+垃圾數據。我不想任何數據只有數據如果有令牌的任何變化。有沒有什麼方法來實現這個?

+4

您是否試圖防止*故意*篡改或意外數據丟失?順便說一下,你的變量名稱與我有關 - 你知道base64絕不會加密*,對嗎?它不會使內容保密。 –

+0

@JonSkeet我猜測OP只想檢測'$ data'的權威性更改,而不是從給定的base64字符串中推斷它。 –

回答

1

要確保只能通過更改$data來更改base64編碼的字符串,則需要添加驗證令牌。

一個簡單的方法來添加這種覈查是通過使用加密散列,其中關鍵是祕密:

$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= 

當您收到這樣的道理,你先上:分裂然後使用第一部分(密鑰散列)來驗證第二部分(數據)的內容。只有匹配,你才能(相對)確信數據沒有被篡改。

2

你應該添加標記,而不是編碼解碼

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

echo $data = base64_decode($encryptedData); 

,並刪除令牌

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

Codepad

和正如Jon Skeet所說base64沒有任何加密功能。它不會使內容保密