一旦我生成了一個salt並散列了密碼(使用bcrypt等),最好是將結果作爲字符串存儲還是作爲字節數組存儲在數據庫中?這兩種方式有什麼好處?或者這是一個更主觀的決定?將散列密碼和salt值存儲在數據庫中的最佳方法 - varchar或binary?
2
A
回答
2
VARCHAR應該足夠了。在我看來,VARCHAR數據會更容易消耗,並且與二進制文件一起工作。
內置的ASP.NET成員資格提供程序還將散列密碼存儲爲VARCHAR字段。
2
如果使用VARCHAR,請確保字節是有效字符或在保存哈希和鹽之前強制字節爲ASCII。爲了使數據損壞更安全,您可能需要先將這些字節以Base64或十六進制編碼,然後再將它們存儲在VARCHAR字段中。
例如,如果存儲從MD5或SHA1的byte[]
輸出部分的字節值可以被移除或更換時byte[]
被轉換爲文本是它們不是有效的UTF-8/Unicode的。如果您使用ASCII,這應該不會成爲問題,但它仍可能導致數據損壞。
如果您不想處理Hex,您可以使用此框架內置的base64方法Convert.ToBase64String。
如果使用VARBINARY並且不嘗試使用和文本編碼方法,則不應該存在此問題,但可能會使比較哈希更困難。
...請注意,如果您使用NVARCHAR
還是會出現這種數據損壞...
static void Main(string[] args)
{
var salt = "MySalt";
var password = "MyPassword";
var saltedKey = CalculateHash(salt, password);
Console.WriteLine(saltedKey);
// MySalt$teGOpFi57nENIRifSW3m1RQndiU=
var checkHash = CheckHash(saltedKey, password);
Console.WriteLine(checkHash);
// True
}
private static string CalculateHash(string saltOrSaltedKey, string password)
{
var salt =
saltOrSaltedKey.Contains('$')
? saltOrSaltedKey.Substring(0, saltOrSaltedKey.IndexOf('$') + 1)
: saltOrSaltedKey + '$';
var newKey = Encoding.UTF8.GetBytes(salt + password);
var sha1 = SHA1.Create();
sha1.Initialize();
var result = sha1.ComputeHash(newKey);
// if you replace this base64 version with one of the encoding
// classes this will become corrupt due to nulls and other
// control character values in the byte[]
var outval = salt + Convert.ToBase64String(result);
return outval;
}
private static bool CheckHash(string saltedKey, string password)
{
var outval = CalculateHash(saltedKey, password);
return outval == saltedKey;
}
1
最MD5/SHA1庫返回哈希的base64在這種情況下,爲varchar就足夠了
相關問題
- 1. 存儲加密密碼和salt或僅存儲加密密碼?
- 2. 在數據庫中存儲salt +密碼哈希和防止密碼攻擊
- 3. 存儲mysql密碼的最佳方法?
- 4. 將映射存儲在數據庫中的最佳方法
- 5. 如何在數據庫中存儲鹽漬散列密碼
- 6. 這是ASP.NET中可用於在數據庫中存儲密碼的最佳散列算法嗎?
- 7. 存儲密碼的最佳方式(無數據庫或純文本)?
- 8. 使用MD5和密碼散列函數在數據庫中存儲時
- 9. 在數據庫中存儲一對多列的最佳方式
- 10. 在MySQL數據庫中存儲數組的最佳方法?
- 11. 在數據庫中存儲BitSet數組的最佳方法?
- 12. 將大量庫存數據存儲在內存中的最佳方法(可變)
- 13. 將標籤存儲在數據庫中的最佳方式?
- 14. 在數據庫中存儲枚舉的最佳方法
- 15. 當散列不適用時將密碼存儲在數據庫中
- 16. 將密碼存儲爲散列值時檢索密碼
- 17. 使用SHA-512和salt來散列MD5散列密碼?
- 18. 在數據庫中散列密碼
- 19. 密碼散列,鹽值和哈希值的存儲
- 20. 在MySQL中存儲散列密碼
- 21. 在數據庫中存儲IP的最佳方法是什麼?
- 22. 在mysql數據庫中存儲python time.struct_time的最佳方法
- 23. asp.net:存儲密碼散列算法
- 24. 在數據庫中存儲密碼的首選方法
- 25. 哪裏是最好的地方存儲網站的密碼salt?
- 26. 將SQL域存儲在SQL數據庫中的最佳實踐?
- 27. xml數據存儲的最佳方法
- 28. 散列密碼時,我應該將散列函數名稱存儲在數據庫中嗎?
- 29. 在數據庫中存儲枚舉值的最佳方式 - 字符串或Int
- 30. 密碼salt應該存儲在數據庫的自己的字段中嗎?
我編碼從來沒有人見過任何人使用任何標準的varchar字符串以外的其他任何東西。 – Layke 2010-08-02 17:18:57