使用机密和共享盐加密整数



我需要一种方法来将我的项目ID传输到浏览器,以防止对项目进行爬行。

我的想法是用一个秘密和共享的salt来加密整数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和SALT对ID进行解密。

int actualRequestedId = decrypt(387439, "randomValue1", SECRET); // result is 1

这是提供信息的:简单整数加密这个:加密单个int 的方法

这两篇文章都没有提到使用盐。也许,如果我只是把秘密分成两部分并传输一半,没有人会努力破解它,但我知道这种滥用算法的行为经常会破坏它,我更希望做得正确。

有什么建议吗?没有必要将ID保持为int,但我将传输大批量的ID,并且确实需要保持较小的ID。由于会有大量的ID,并且加密过程会阻塞结果UI,所以成本不应该太高。如果能利用开箱即用的.NET(C#)加密,那就太好了

编辑:我突然想到另一种(更高带宽)的方法是向每个ID添加一个随机的高32位,并用秘密加密,而不是使用salt。这将非常有效,但由于这是对算法的又一次滥用,用户从同一ID生成多次迭代的能力很可能会泄露秘密(或者不太重要的是,个人ID)。

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

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

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

这是在其他链接中提交的答案之外。

最新更新