0

我需要一种将我的项目 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)。

4

1 回答 1

1

格式保留加密可能是您正在寻找的东西,但实现起来并不容易。您可以使用链接到服务器上的会话的随机密钥。攻击者可以简单地请求所有值,但无法猜测它们。

CTR 密码可以加密任何值并返回相同的大小(以位为单位)。它们具有更好的可用性(在 API 中),但它们需要一个 NONCE 用于使用相同密钥的每个加密。

或者,您可以简单地在服务器上保留一个表并记住一个随机 ID 到项目 ID。这样,攻击者除了通过服务器提交给他的项目外,根本无法检索任何东西。这可能比其他解决方案容易得多,但它需要额外的表内存(当然)。

除了在其他链接中提交的答案之外。

于 2012-07-28T12:41:52.403 回答