我使用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對象,一個值和一個參數索引。我對參數本身或持久化對象的類型一無所知。我只有一個價值。我無法生成隨機鹽並將其存儲在單獨的屬性中,因爲我不知道要持久化的對象上存在哪些屬性,也不知道它們存儲在參數集合中的順序。我的目標是在此方法調用的上下文中以最安全的方式散列密碼。如果您要反駁我的建議,在此範圍內收到的替代想法會很有幫助。
+1在實施自制加密方案之前提出問題,這幾乎不是一個好主意。 – 2012-04-07 04:51:18
你打算如何使用生成的哈希進行身份驗證?通常,應用程序將爲給定的登錄名檢索鹽,迭代和散列值。然後,它會計算一個新的散列,給出一個密碼以及它從數據庫中檢索到的salt和迭代參數,並將新散列與存儲值進行比較。 – erickson 2012-04-07 20:01:14