我想加密一个id并传递给一个链接...例如
id=196
encryptedid=345
randno=234
encryptedrandno=456
id=encryptedid+encryptedrandno
link: id
so when user clikcs that link at backend
id=id-encryptedrandno(which gives us encryptedid)
id=decrypt(id)
Run Code Online (Sandbox Code Playgroud)
请告诉我这个逻辑,我正在使用c#web应用程序
有三个数字(现在是编辑问题后的六个),你基本上有一个非常小的源和目标域 - 我希望这不是重要的事情.
有效地在值之间创建bimap的最简单方法可能是创建值0-999的列表,并将其混洗(以某种可重现的方式).然后,您可以通过获取特定索引处的值来"加密",并通过查找该值的索引来"解密":
int id = ...;
int encrypted = shuffledValues[id];
int decrypted = shuffledValues.IndexOf(encrypted);
Run Code Online (Sandbox Code Playgroud)
您可以通过构建字典来更快地"解密",请注意:
Dictionary<int, int> decryptionDictionary =
shuffledValues.Select((value, index) => new { value, index })
.ToDictionary(p => p.value, p => p.index);
Run Code Online (Sandbox Code Playgroud)
这显然比传统的加密方法占用更多内存,但编码非常简单.
与几乎任何其他安全问题不同,我认为在这种情况下,仅仅System.Random用于改组也不会太糟糕- 但这并不是因为Random通常适用于安全用途; 这是因为你有一个非常小的潜在价值范围.
我会认真地试图摆脱使用3位数ID.
另一种方法是生成新的GUID.在您的数据库中,存储原始ID和生成的GUID,并将GUID交还给客户端(例如,在链接上).收到GUID时,可以在数据库中执行查询以获取原始数据.
编辑:即使是6位数的ID也不会比原来的3好多了.很容易尝试每一百万个数字,因此攻击可以快速访问每个可能的链接.每秒获取十个链接,他们可以在不到两天的时间内获取所有链接.即使有速率限制,你仍然基本上远离安全.
换句话说:如果有人要求你为网站选择密码,但是说它只需要6位数,你觉得有多安全?