2009-08-12 42 views
4

我正在尋找加密數據。我想根據密碼生成加密密鑰,以及一些移動的值,如時間。我們的目標是進行關鍵性的改變,但任何知道密碼的人都可以解密。這發生在C#中。我正在使用以下代碼來散列密碼。您將如何生成可重複加密密鑰?

private static string GetPasswordHash(string password) 
{ 
    TimeSpan span = (DateTime.UtcNow - new DateTime(1900, 1, 1)); 
    string result = Convert.ToInt32(span.TotalHours).ToString(); 
    result += password; 
    result += Convert.ToInt32(span.TotalDays).ToString(); 
    result = Convert.ToBase64String(SHA256.Create().ComputeHash(Encoding.ASCII.GetBytes(result))); 
    return result; 
} 

然後我使用該散列,再加上一個鹽來生成一個鍵。

 Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(GetPasswordHash(password), salt); 
     rdb.IterationCount = 1000; 

     RijndaelManaged rm = new RijndaelManaged(); 
     rm.KeySize = 256; 
     rm.Key = rdb.GetBytes(32); 
     rm.IV = rdb.GetBytes(16); 

似乎有問題與我這樣做的方式。某些計算機處於不同的時區,或者如果在我發送數據時小時打勾,或者機器時間略有偏差。有更好的建議嗎?

回答

8

標準策略是隻發送剛剛通過加密密鑰發送的值(時間等)。由於您使用的價值是公共知識,因此,如果誰先創建密碼,就可以公開提供「移動價值」。見Salt。你在做什麼不是一項新技術。您似乎也在使用Key Strengthening

1

您可以找到一種方案,以當前時間爲中心在時間窗口上生成相同的移動值。因此,如果您選擇一個12小時的窗口,則所有計算機將在您的6小時後6小時之前生成相同的加密密鑰。

2

您可能只需將更改部分(未加密)與加密數據一起發送,以便知道密碼的任何人都可以輕鬆地重建用於加密的密碼。由於變化部分相對容易猜測,因此不會使安全性降低。

0

你是否擔心用相同密碼加密的相同數據的文件看起來相同? 您可以使用當前時間設置初始化向量,並使用您的密碼進行加密。 要解密,您使用相同的IV值(因此必須在您的文件的某個位置未加密存儲)。

0

基於密碼的密鑰派生已經在.net中實現。儘管我看不到GetPasswordHash()函數有什麼問題,但它總是值得在crypto中使用庫函數,因爲它們可能會得到更好的測試,小錯誤可能會完全破壞系統的安全性。我這裏還有兩個鏈接,有可能是別人太:

rfc2898derivebytes

passwordderivebytes