我需要一种方法,以防止抓取/抓取项目的方式将我的商品ID传输到浏览器。
我的想法是使用秘密和共享盐加密整数ID。这允许为同一个唯一项目提供大量永久但不可预测的URL。假设我需要传输记录1和2的结果。而不是以明文形式传输ID:
{
1: "Item One",
2: "Item Two"
}
我将首先加密网络服务器上的ID:
string RESULT_SET_SALT = "randomValue1";
foreach(ResultItem item in results) {
item.id = encrypt(SECRET, RESULT_SET_SALT, id);
}
实际传输到客户端的是salt和加密值:
{
RESULT_SET_SALT: "randomValue1",
387439: "Item One",
79: "Item Two"
}
当客户端选择要查看详细信息的项目时,AJAX请求包含salt和加密值。
$.get("/ItemDetails/387439?RESULT_SET_SALT=randomValue1");
在服务器上,使用SECRET解密ID,并对请求中包含的客户端进行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)。答案 0 :(得分:1)
格式保留加密可能是您正在寻找的东西,但实现起来并不容易。您可以使用链接到服务器上的会话的随机密钥。攻击者可以简单地请求所有值,但无法猜测它们。
CTR密码可以加密任何值并返回相同的大小(以位为单位)。它们具有更好的可用性(在API中),但是对于使用相同密钥的每次加密,它们都需要NONCE。
或者,您只需在服务器上保留一个表格,并记住随机ID到项目ID。这样,除了通过服务器提交给他的项目之外,攻击者根本无法检索任何内容。这可能比其他解决方案容易得多,但它需要额外的内存(当然)。
除了在其他链接中提交的答案之外。