[英]Encryption of a 6 digit number into another 6 digit number in c#
我想加密一个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)
请告诉我我正在使用C#Web应用程序的逻辑
用三位数字(问题编辑后为六位),您基本上有一个很小的源域和目标域-我希望这对任何重要的事情都不重要。
有效创建值之间的bimap的最简单方法可能是创建值0-999的列表,并对其进行混洗(以某种可复制的方式)。 然后,您可以通过获取特定索引处的值来“加密”,并通过找到该值的索引来“解密”:
int id = ...;
int encrypted = shuffledValues[id];
int decrypted = shuffledValues.IndexOf(encrypted);
您可以通过构建字典来使“解密”更快,请注意:
Dictionary<int, int> decryptionDictionary =
shuffledValues.Select((value, index) => new { value, index })
.ToDictionary(p => p.value, p => p.index);
显然,这比传统的加密方法需要更多的内存,但是编码非常简单。
与几乎所有其他安全性问题不同,我认为在这种情况下,仅使用System.Random
进行改组并不会太糟糕-但这不是因为Random
通常适合于安全性用途; 这是因为开始时的潜在值范围非常小。
我会认真尝试摆脱使用3位数ID的做法。
一种替代方法是改为生成新的GUID。 在您的数据库中,存储原始ID和生成的GUID,然后将GUID交还给客户端(例如,在链接上)。 收到GUID时,可以在数据库中执行查询以获取原始数据。
编辑:即使是6位数的ID也不会比原始3更好。尝试一百万个数字中的每个数字都很容易,因此攻击可以快速访问每个可能的链接。 每秒获取十个链接,他们将能够在不到两天的时间内全部获取它们。 即使进行了速率限制,您仍然基本上还不能保证安全。
换句话说,如果有人要求您选择一个网站密码,但是说它只能是6位数字,那么您的安全感如何?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.