任何加密方案都可以安全地允许我重复加密相同的整数,每次都添加不同的随机材料吗?这似乎是一种可能让我陷入困境的手术。
我想防止在我的 Web 应用程序中抓取项目,但仍然具有持久的项目 ID/URL,因此内容链接不会随着时间的推移而过期。我对此的安全要求并不高,但我宁愿不要做一些完全愚蠢的事情,这显然会泄露秘密。
// performed on each ID before transmitting item search results to the client
public int64 encryptWithRandomPadding(int32 id) {
int32 randomPadding = getNextRandomInt32();
return encrypt(((int64)randomPadding << 32) + id), SECRET);
}
// performed on an encrypted/padded ID for which the client requests details
public int32 decryptAndRemoveRandomPadding(int64 idToDecrypt) {
int64 idWithPadding = decrypt(idToDecrypt, SECRET);
return (int32)idWithPadding;
}
static readonly string SECRET = "thesecret";
生成的 ID/URL 是永久性的,加密的 ID 是稀疏填充的(uint32.Max 中小于 1 是唯一的,我可以添加另一个常量填充以减少存在猜测的可能性),并且客户端可以运行相同的搜索和每次使用不同的代表 ID 得到相同的结果。我认为它符合我的要求,除非存在明显的密码问题。
例子:
encrypt(rndA + item1) -> tokenA
encrypt(rndB + item1) -> tokenB
encrypt(rndC + item2) -> tokenC
encrypt(rndD + item175) -> tokenD
在这里,无法确定 tokenA 和 tokenB 都指向相同的项目;这可以防止蜘蛛删除重复的搜索结果而不检索它们(同时检索会增加使用量表)。此外,item2 可能不存在。
知道重新运行搜索将返回具有相同秘密的相同 int32 填充的多种方式,我可以使用任何流行的加密算法安全地做到这一点吗?谢谢,加密专家!
注意:这是一个没有像我希望的那样解决的问题的后续行动:Encrypt integer with a secret and shared salt