2013-02-12 38 views
0

例如,許多軟件使用的許可證密鑰等。我曾想過對一個序列進行加密簽名,所以我可能有4個字節的ID和8個字節的簽名,但是我找不到合適的算法。如何生成一組易於檢查但很難僞造的(簡短)唯一標識符?

我需要的是攻擊者不能輕易產生的東西,但是存儲在少於大約20個ASCII字節中。我也需要對獨特性有信心。這並不需要是完全安全的,只能防止偶然的攻擊。

注意:我在java上使用appengine。

回答

1

只需爲每個ID生成一個GUID並跟蹤您在數據庫中生成的ID。 GUID的範圍非常大,每個GUID都是獨一無二的。這不是密碼學,所以有可能任何一個擁有足夠多的生成匹配的人都可以產生匹配,但我認爲可能性仍然很小。

GUID是128位,可以使用Base64以23個字節編碼。

0

聽起來像HMAC。您可能需要手動確保唯一性。

+0

這可以在少量字節中完成嗎?越小越好,因爲我將在QR代碼中使用這些代碼... – 2013-02-12 02:13:24

+0

@RichardRussell HMAC的長度與基礎散列的長度相同,例如,對於MD5 128位(十六進制32字節,base64 24字節,你可能不能只使用16字節的二進制表示)。如果您需要以某種方式識別密鑰,則還需要附上您的ID。 – wRAR 2013-02-12 02:24:06

0

計算包括id在內的值到一個字符串中,並使用帶密鑰和最大長度的基於字節的HDMAC。只要確保您在要加密的值中有獨特的部分。這可能是服務器時間或其他ID。長度將需要測試,它仍然在你的20個字符的要求。

0

加密是可逆的,所以輸出保證唯一的唯一輸入。每次只使用相同的密鑰對0,1,2,3,4,5等進行加密。對於128位輸出,在ECB模式下使用AES和128位數字。其他模式也需要相同的IV/Nonces。對於64位數字使用DES。對於其他尺寸的數字,可以使用Hasty Pudding密碼器,或者根據需要調整您自己的簡單Feistel密碼器。

ECB並不是最安全的模式,但我不覺得您在這裏尋找非常高的安全級別。