2016-07-26 110 views
-1

我有這個簡單的類,其具有2種方法:固定鹽生成基於輸入的字符串 - C#

private static byte[] PBKDF2(string field, byte[] salt, int iterations, int outputBytes) 

    { 
     Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(field, salt); 
     pbkdf2.IterationCount = iterations; 
     return pbkdf2.GetBytes(outputBytes); 
    } 

public static string CreateHash(string field, String salt) 
    { 
     //if (Array.TrueForAll(salt, x => x == 0)) 
     //{ 
     // RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider(); 
     // csprng.GetBytes(salt); 
     // string s = Convert.ToBase64String(salt); 
     //} 
     byte[] salts = Encoding.ASCII.GetBytes(salt); 
     byte[] hash = PBKDF2(field, salts, PBKDF2_ITERATIONS, HASH_BYTE_SIZE); 
     return Convert.ToBase64String(hash); 
    } 

我需要,其中用戶輸入了一個簡單的字符串,如「ABC」和我需要提供一個前端在此基礎上生成鹽。這是我要存儲在數據庫中的內容,並使用它傳遞給上述方法(CreateHash)以取消識別 數據。這個salt/key需要能夠解密,我必須在前端顯示。

我也可以使用其他類/庫。它不一定是Rfc2898DeriveBytes。

請給我提供一些關於如何實現這種鹽/密鑰生成功能的信息。這種鹽不能是一個隨機值。

謝謝!

+4

鹽應該是隨機的,而不是根據用戶輸入。鹽的整個點是如果有人輸入相同的輸入兩次,你會得到兩個不同的輸出。如果你這樣做是因爲當你去驗證'byte []'的時候你需要「知道salt」,那麼你只需在鹽塊的前面或後面添加或附加salt,當你去請確認您拉出鹽並將其送入PBKDF2功能。 –

+0

可能的[解決方案](https://social.msdn.microsoft.com/Forums/vstudio/en-US/d6a2836a-d587-4068-8630-94f4fb2a2aeb/encrypt-and-decrypt-a-string-in-c?論壇= csharpgeneral),但它使用Rfc2898 ...你爲什麼不想使用它? –

+0

@ScottChamberlain我明白,鹽應該是動態的,但這裏的要求是不同的。這不適用於密碼存儲。我們需要取消識別數據並將它們存儲在文件中。每次文件附帶一些數據時,我們都會加密並生成另一個文件。所有的個人信息都被取消標識。但是,例如,對於給定字段名稱David,它始終需要轉換爲與之前生成的字符串相同的加密字符串。它不是由我定義的!如果我修復了salt&pass到Rfc2898DeriveBytes以獲取相同輸入的相同字符串。 – vrkala

回答

0

你提到你需要解密散列字符串。

PBKDF2不是一種加密算法,而是一種密鑰派生函數,無論是否使用salt,您都無法從結果哈希中計算原始輸入。

你應該尋找的是加密,而不是散列。

查看this link的一些示例。