繁体   English   中英

在C#中将6位数字加密为另一个6位数字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM