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

时间:2012-07-28 04:20:37

标签: .net encryption

我需要一种方法,以防止抓取/抓取项目的方式将我的商品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)。

1 个答案:

答案 0 :(得分:1)

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

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

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

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