.net 使用秘密和共享salt加密整数

.net 使用秘密和共享salt加密整数,.net,encryption,.net,Encryption,我需要一种将我的项目ID传输到浏览器的方式,以防止对项目进行爬网/爬网 我的想法是用一个秘密和共享的salt加密整数id。这允许为同一唯一项提供大量永久但不可预测的URL。假设我需要传输记录1和记录2的结果。而不是以透明的方式传输ID: { 1: "Item One", 2: "Item Two" } 我将首先在web服务器上加密ID: string RESULT_SET_SALT = "randomValue1"; foreach(ResultItem item in res

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

我的想法是用一个秘密和共享的salt加密整数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);
}
实际传输到客户端的是salt和加密值:

{
    RESULT_SET_SALT: "randomValue1",
    387439: "Item One",
    79: "Item Two"
}
当客户端选择要查看详细信息的项目时,AJAX请求包含salt和加密值

$.get("/ItemDetails/387439?RESULT_SET_SALT=randomValue1");
在服务器上,使用请求中包含的客户机的密码和密码对ID进行解密

int actualRequestedId = decrypt(387439, "randomValue1", SECRET); // result is 1
这是信息性的: 这是:

这两篇文章都没有提到使用盐。也许,如果我只是将秘密分成两部分并传输一半,没有人会努力破解它,但我知道滥用算法往往会破坏它,我更愿意正确地处理它

有什么建议吗?没有必要将ID保持为int,但是我将传输大量的ID,并且确实需要将它们保持在较小的范围内。由于将有大量的ID,并且加密过程将阻塞结果UI,因此不会太昂贵。如果能利用开箱即用的.NET(C#)加密就好了


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

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

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

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


这是对其他链接中提交的答案的补充。

您应该检查。你找不到关于salt的任何东西的原因是加密不使用salt。它可能使用IV或NONCE,但SALT通常用于密钥派生函数。感谢对SALT的说明。我想知道,基于与每个响应相关联的秘密,如果只对ID执行一些非秘密操作,是否会获得相同的结果(加密并随响应和相关详细信息请求一起发送,或存储在服务器会话状态)。我真的不需要加密这些数字。所以只需将它们添加到ID或XOR即可。在这种情况下,加密似乎不是唯一可能的答案。如果它存在,它应该是经过深思熟虑的方案的一部分。加密不是魔法(不幸的是,它会让我成为魔术师:).我喜欢在服务器会话密钥中使用随机密钥的想法,但我也不喜欢。到目前为止,我已经能够完全避免会话(没有客户端链接状态)。我假设为每个响应加密/传输一个随机对称密钥也是这样。我拍摄的另一个特性是唯一项的URL的非唯一性(detail/987343和detail/12392可能返回相同的项)。我意识到在明文中分离盐并不能提供这个。。。正如您所说,只需迭代所有加密的ID。虽然,由于大多数都不存在,但实际上每日配额将无法解决这一问题。此外,将ID映射为随机ID的内存映射不仅会增加服务器的内存。这意味着映射将保留在我的数据库中,或者在服务器之间无效,或者应用程序重新启动。我仍在处理您的答案,并且可能会接受它,尽管我的架构可能是真正的限制。我想我可以有一个单独的机制来通过电子邮件发送半永久性项目URL,它们只有一个有效期。谢谢你的帮助,我接受这个答案,并从另一个角度发布这个问题。下面是我的后续问题: