我需要一种将我的项目 ID 传输到浏览器的方法,以防止爬取/抓取项目。
我的想法是使用秘密和共享盐来加密整数 ID。这允许同一唯一项目有大量永久但不可预测的 URL。假设我需要传输记录 1 和 2 的结果。而不是明文传输 ID:
{
1: "Item One",
2: "Item Two"
}
我将首先在 Web 服务器上加密 ID:
string RESULT_SET_SALT = "randomValue1";
foreach(ResultItem item in results) {
item.id = encrypt(SECRET, RESULT_SET_SALT, id);
}
实际传输给客户端的是盐值和加密值:
{
RESULT_SET_SALT: "randomValue1",
387439: "Item One",
79: "Item Two"
}
当客户端选择一个项目来查看详细信息时,AJAX 请求包括盐和加密值。
$.get("/ItemDetails/387439?RESULT_SET_SALT=randomValue1");
在服务器上,使用请求中包含的客户端的 SECRET 和 SALT 对 ID 进行解密。
int actualRequestedId = decrypt(387439, "randomValue1", SECRET); // result is 1
这两篇文章都没有谈到使用盐。可能,如果我只是将秘密分成两部分并传输一半,没有人会努力破解它,但我知道滥用算法经常会破坏它,我更愿意正确地做到这一点.
有什么建议吗?没有必要将 ID 保持为 int,但我将大量传输它们,并且确实需要保持它们很小。由于会有大量的 ID 并且加密过程会阻塞结果 UI,所以它应该不会太昂贵。如果这利用了开箱即用的 .NET (C#) 加密,那就太好了
编辑:在我看来,另一种(更高带宽)的方法是向每个 ID 添加一个随机的高 32 位并用秘密加密它,而不是使用盐。这会很好用,除非这是对算法的另一种滥用,用户从同一个 ID 生成多次迭代的能力很可能会危及秘密(或者不太重要的个人 ID)。