2015-05-24 15 views
7

我找不到答案。如果我使用Base64編碼一個字符串,編碼輸出將根據字符串是唯一的嗎?我問,因爲我想創建一個包含用戶信息的令牌,所以我需要確保輸出根據信息是唯一的。base64編碼的字符串是唯一的嗎?

例如,如果我編碼「UnqUserId:987654321時間戳:01/02/03」這將是獨一無二的,所以不管其他用戶使用什麼其他用戶標識符都不會有碰撞?

+1

Base64是*不*加密。但是,是的,不同的輸入字符串將始終編碼爲不同的Base64編碼的字符串,並且相同的輸入字符串將始終編碼爲相同的Base64編碼的字符串。這不是一個散列,但輸入的小改動只會導致輸出的小改變。 – Blorgbeard

回答

8

這是一種編碼而不是加密。既然你可以解碼字符串,它必須是唯一的。

+9

計數器爲您的聲明示例:base64值'QzNWwc =='和'QzNWwQ =='編碼相同的二進制值:0x433356c1。您可以使用以下命令檢查它:echo <> | base64 -d | xxd – user1861174

+0

我注意到RSA私鑰存在同樣的問題。我從文件中提取了base64編碼組件,例如rsa_key.orig。接下來我執行命令:echo'<< BASE64_encoded_key >>'| base64 -d | openssl rsa -inform der -out rsa_key.new。我比較了這些文件,它們是不同的。新文件比原始文件小24字節。然後我檢查了每個文件的模數,它們是相同的。 – Bruce

17

晚兩年,但在這裏我們去:

簡短的回答是肯定的,唯一的二進制/十六進制值將總是編碼來編碼字符串一個獨特的base64。

但是,多個base64編碼的字符串可能代表一個二進制/十六進制值。

這是因爲十六進制字節未與base64'數字'對齊。單個十六進制字節由8位表示,而單個base64位由6位表示。因此,任何非6位對齊的十六進制值可以有具有多個base64表示(儘管正確實施的base64編碼器應該編碼爲相同的base64表示)。

這種未對齊的例子是十六進制值'0x433356c1'。該值由32位表示,base64編碼爲'QzNWwQ =='。但是,這個32位值不是6位對齊的。那麼會發生什麼?在這種情況下,base64編碼器將四個零位填充到二進制表示的末尾,以使得序列36位並因此6位對齊。

解碼時,base64解碼器現在必須解碼爲一個8位對齊的值。它截斷填充位並將前32位解碼爲十六進制值。例如,'QzNWwc =='和'QzNWwQ =='是不同的base64編碼字符串,但解碼爲相同的十六進制值0x433356c1。如果我們仔細觀察,我們注意到,前32位都是相同的這兩種編碼字符串:

'QzNWwc==': 
010000 110011 001101 010110 110000 011100 

'QzNWwQ==': 
010000 110011 001101 010110 110000 010000 

唯一的區別是最後四位,它們會被忽略。請記住,沒有base64編碼器曾經爲'QzNWwQ =='以外的其他0x433356c1生成'QzNWwc =='或任何其他base64值,因爲添加的填充字節應始終爲零。

總之,假設唯一的二進制/十六進制值將始終使用正確實現的base64編碼器編碼爲唯一的base64表示形式是安全的。如果base64字符串在不填充填充/對齊字節的情況下生成,則只會在解碼過程中發生「衝突」。

+2

對於喜歡你的人甚至在「回答已接受」的問題上都有詳細的解答!你的結論是正確的標記 - 如果編碼(填充)的部分鬆懈,那麼將是錯誤的解碼:) – harshvchawla

+1

這應該是被接受的答案。我正在聯繫OP;) –