任何加密方案能否安全地允許我重複加密相同的整數,並且每次都使用不同的隨機材料?這似乎是那種可能讓我處於熱水中的手術。反覆加密(隨機填充+ const int32) - 妥協祕密?
我想阻止我的web應用程序中的項目被盜取,但仍有持久的項目ID/URL,因此內容鏈接不會隨着時間的推移而過期。我的安全要求並不高,但我寧願不做一些完全無知的事情,這顯然會危及祕密。
// performed on each ID before transmitting item search results to the client
public int64 encryptWithRandomPadding(int32 id) {
int32 randomPadding = getNextRandomInt32();
return encrypt(((int64)randomPadding << 32) + id), SECRET);
}
// performed on an encrypted/padded ID for which the client requests details
public int32 decryptAndRemoveRandomPadding(int64 idToDecrypt) {
int64 idWithPadding = decrypt(idToDecrypt, SECRET);
return (int32)idWithPadding;
}
static readonly string SECRET = "thesecret";
生成的ID/URL是永久性的,經過加密的ID人口稀少(小於1 uint32.Max是唯一的,並且我可以添加另一個常數填充到縮減現有猜測的情形產生),並且客戶端可以每次運行相同的搜索並使用不同的代表ID獲得相同的結果。我認爲它符合我的要求,除非有明顯的密碼問題。
實施例:
encrypt(rndA + item1) -> tokenA
encrypt(rndB + item1) -> tokenB
encrypt(rndC + item2) -> tokenC
encrypt(rndD + item175) -> tokenD
在此,就沒有辦法,以確定tokenA和tokenB都指向相同的項目;這可以防止蜘蛛刪除重複搜索結果而不檢索它們(同時檢索增量使用量表)。另外,item2可能不存在。
知道重新運行搜索將返回相同的int32填充多個方式與相同的祕密,我可以安全地使用任何流行的加密算法?謝謝,加密專家!
注:這是一個後續問題如我所希望的是沒有解決:Encrypt integer with a secret and shared salt
如果ID沒有改變或失效,任何人都可以簡單地記住他們看到的那些,而且不能讓他們忘記。您可以從大量項目中隨機分配ID以使其難以列出,但這並不會讓您很難記住它們。當然,您可以限制在任何給定時間段內可以從一個IP請求多少個ID。這有幫助嗎? – Qsario 2012-07-29 04:39:56
@qsario:謝謝。對於記住他們所見過的人來說,我確實可以。由於數百萬個網址代表相同的項目,並且數百萬個網址無效,因此該網址無法幫助我抓取內容。此外,我確實計劃實施檢查項目的每日配額。 – shannon 2012-07-29 05:01:14