我需要一種方法來以防止抓取/抓取項目的方式將我的物品ID傳輸到瀏覽器。使用祕密和共享的鹽加密整數
我的想法是使用祕密和共享salt加密整數ID。這允許大量永久但不可預知的URL用於同一個唯一項目。假設我需要傳送的記錄1和2的結果,而不是發送的ID中明確:
string RESULT_SET_SALT = "randomValue1";
foreach(ResultItem item in results) {
item.id = encrypt(SECRET, RESULT_SET_SALT, id);
}
實際發送內容:
{
1: "Item One",
2: "Item Two"
}
我先在web服務器加密的ID到客戶端是鹽和加密值:
{
RESULT_SET_SALT: "randomValue1",
387439: "Item One",
79: "Item Two"
}
當客戶端選擇一個項目,以查看細節,AJAX請求包括鹽和加密值。
$.get("/ItemDetails/387439?RESULT_SET_SALT=randomValue1");
在服務器上,ID使用SECRET和SALT解密請求中包含的客戶端。
int actualRequestedId = decrypt(387439, "randomValue1", SECRET); // result is 1
這是信息:Simple integer encryption 這:Way to encrypt a single int
有關使用鹽也不文章會談。也許,如果我將祕密分成兩部分並傳輸一半,沒有人會努力破解它,但我知道算法的濫用類型往往會破壞它,我寧願正確地做到這一點。
有什麼建議嗎?沒有必要將ID保持爲int,但是我將傳輸大量的ID,並且需要將它們保持爲小。由於會有大量的ID並且加密過程會阻止結果UI,因此它不應該太昂貴。這將是很好,如果這槓桿開箱即用的.NET(C#)加密
編輯:它發生在我身上,另一個(更高的帶寬)方法是爲每個ID添加一個隨機的高32位並用祕密進行加密,而不是使用鹽。如果這是另一種算法濫用,用戶使用相同ID生成多次迭代的能力可能會危及祕密(或者不那麼重要的是個人ID),那麼這將會很好。
您應該檢查[格式保留加密](http://en.wikipedia.org/wiki/Format-preserving_encryption)。你找不到任何有關鹽的原因是加密不使用鹽。它可以使用IV或NONCE,但鹽通常用於密鑰派生函數。 – 2012-07-28 11:54:26
感謝您對鹽的澄清。 – shannon 2012-07-29 03:34:50
我不知道它是否會達到相同的結果,簡單地在ID上執行一些非祕密操作,基於與每個響應相關的祕密(加密和與響應一起發送以及相關的詳細請求,或存儲在服務器會話狀態)。我並不需要加密數字。所以只需添加或XOR他們的ID。 – shannon 2012-07-29 03:42:55