簡體   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