2012-04-07 100 views
3

我使用NHibernate,並有一個自定義類型來加密數據庫中的密碼,以便我可以使用字符串屬性來表示密碼,但NHibernate在存儲在數據庫之前轉換/加密值。目前,我在配置文件中存儲了一個salt值和一個加密密鑰,但我真的更願意轉向密碼哈希。然而,自定義NHibernate類型除了要被處理的屬性的值之外並不知道被存儲的對象,所以我不能生成一些隨機鹽並將其與該自定義類型中的另一個屬性中的對象一起存儲。可以從密碼派生鹽,然後散列密碼+派生鹽?

因爲我不能單獨存儲鹽,我想知道從密碼本身派生鹽,然後散列這兩者的組合是否可以。例如,我可能會輸入密碼,MD5將其散列,然後使用MD5散列作爲鹽。這會好嗎?這樣可以讓我以確定的方式持續保存密碼,同時爲每個密碼使用唯一的(但派生的)salt值,但是這樣做時是否有任何安全考慮?

編輯:

因爲所有的我已經收到到目前爲止都未能佔到問題的情況下的答案,讓我來介紹NHibernate的術語定義的方法的簽名。

public override void Set(IDbCommand cmd, object value, int index) 
{ 
    var param = (IDataParameter)cmd.Parameters[index]; 

    if (value == null) 
    { 
     param.Value = null; 
    } 
    else 
    { 
     var temp = value.ToString(); 
     var encrypted = encryptor.Encrypt(temp); 
     param.Value = encrypted; 
    } 
} 

這就是所有的NHibernate給我的。我收到IDbCommand對象,一個值和一個參數索引。我對參數本身或持久化對象的類型一無所知。我只有一個價值。我無法生成隨機鹽並將其存儲在單獨的屬性中,因爲我不知道要持久化的對象上存在哪些屬性,也不知道它們存儲在參數集合中的順序。我的目標是在此方法調用的上下文中以最安全的方式散列密碼。如果您要反駁我的建議,在此範圍內收到的替代想法會很有幫助。

+0

+1在實施自制加密方案之前提出問題,這幾乎不是一個好主意。 – 2012-04-07 04:51:18

+0

你打算如何使用生成的哈希進行身份驗證?通常,應用程序將爲給定的登錄名檢索鹽,迭代和散列值。然後,它會計算一個新的散列,給出一個密碼以及它從數據庫中檢索到的salt和迭代參數,並將新散列與存儲值進行比較。 – erickson 2012-04-07 20:01:14

回答

5

不!如果你從密碼中得到鹽,那麼所有相同的密碼都有相同的散列值,鹽就沒用了。

嘗試

var temp = value.ToString(); 
var salt = generateRandonSalt(); 
var encrypted = encryptor.Encrypt(temp + salt); 
param.Value = salt + encrypted; 

用「+」我的意思是串聯操作或一些與你的價值兼容。自然,你需要知道鹽的長度,以便下次檢查密碼。

+0

Kneejerk反應放在一邊,對相同的密碼只使用相同的散列,而不是使用全局散列密碼相同的散列是不是更好? – Chris 2012-04-07 04:28:23

+2

不,必須隨機生成鹽,每次散列並存儲密碼。 – dash1e 2012-04-07 04:39:30

+0

請閱讀我的編輯,我想你會明白爲什麼這根本不是一個選項。 – Chris 2012-04-07 04:40:24

1

你的例子的問題是,如果一些攻擊者想要找到一個匹配,他們可以創建一個彩虹表,其中所有的密碼都被他們的md5 couterparts醃製。

每個條目的鹽應該是唯一的,這樣黑客必須擁有每個可能的鹽的每個可能的MD組合的反向工程表。

3

哈希函數的用途是從密碼中派生出一些東西。如果你從密碼中派生鹽,那麼派生實際上就是你的哈希函數的一部分。你剛剛改變/增強了散列函數,並且實際上並沒有鹽。

鹽必須是隨機的。

他們的工作是讓暴力破解密碼更困難。如果一個鹽具有65536個不同的值(例如),那麼這意味着相同的密碼可以散列65536個不同的方式。如果有人想建立一個反轉回密碼的字典,他的字典只需要一個密碼就可以輸入65536個條目。

鹽必須與此想法的密碼無關工作。

0

如果您的鹽狀計劃的目的是使密碼使用預先確定的哈希字典攻擊性,那麼你的做法可能有點不是無鹽哈希更安全,但幾乎沒有安全的使用一個有效的鹽。有效的鹽

一個顯著的安全利益是相同的密碼的兩個實例會產生兩個不同的哈希值。在您的方案下,知道一個用戶的密碼和散列會讓攻擊者推斷具有相同散列的另一個用戶的相同密碼。