簡體   English   中英

將密碼存儲到sql的最佳方法

[英]Best way to store password into sql

在我目前的C#windows應用程序中,密碼以純文本形式存儲,這顯然不是很好。 所以我只想知道加密密碼並存儲到SQL Server的最佳方法是什么。 我已經讀過使用hash + salt更好。 但我覺得“EncryptByPassPhrase”,“DecryptByPassPhrase”在sql 2005中的新功能更好用,因為你正在處理SQL Server本身的所有內容,我想它使用的是三重DES。 有人建議使用它是否好?

您是否需要訪問原始密碼,或者您只是嘗試將輸入的密碼與數據庫中的密碼進行比較?

如果您需要訪問原始密碼,那么您將不得不使用加密算法而不是哈希算法。

如果您所做的只是在數據庫中存儲密碼,以便以后可以根據已知的輸入值進行檢查,那么使用salt的哈希將起作用。

請記住,當客戶端發送憑證以進行驗證時,您不希望以明文形式發送密碼!

哈希和鹽是要走的路,因為無法從中檢索原始密碼。 如果你加密然后解密密碼,明文密碼是可檢索的,所以它不是最好的。

我同意將加密全部放在一個位置是有意義的。 但是,如果將密鑰與數據(c#代碼中的密鑰,數據庫中的數據)分開,則可以提高安全性。 此外,Sql Server在加密時使用主密鑰,這意味着如果需要將數據還原到新服務器,則無法恢復數據。

這一切都歸結為密鑰管理以及您希望如何做到這一點。

與大多數問題一樣,最佳答案取決於您的情況。 沒有好的解決方案。

一些選擇:

  1. 保留密碼為純文本或可逆加密。 使用SQLServer工具加密RDBMS級別的重要字段或使用類似的加密功能,並希望MS實施合理的密鑰管理,並且密鑰對於您的目的而言是相當安全的。 在實踐中,所有加密都是將大量小秘密存儲到一個大秘密的存儲中。它可能使問題更容易管理,但問題本身永遠不會消失。

  2. 使用散列算法或某種形式的crypt()不可逆地“加密”密碼。 根據可用的攻擊向量,這種方法可能無法提供明顯改進明文存儲安全性的方法。

在選擇安全認證算法方面,使用散列密碼會限制您的選擇。 使用這種方法,您可能最終會發送純文本或其他材料,而這些材料在傳輸方面並不好(無論是否使用未綁定的加密),這可能是信任POV的重大風險。

如果哈希被盜,則可以接受脫機字典攻擊,如果密碼對攻擊者有任何價值,則應該直接假設恢復密碼。

在某些情況下,密碼哈希的知識可能與在系統訪問方面知道密碼一樣糟糕。

如果您確定永遠不會使用散列方案進行身份驗證(如HTTP Digest Auth),則散列密碼更安全。 為了避免彩虹表攻擊,請使用nonce(或salt)。 我會使用HMAC-SHA1並使用nonce作為密鑰。 它們必須與密碼一起存儲。

否則,您必須存儲加密密碼,因為散列密碼無法與涉及哈希的身份驗證一起使用。 對於加密,我有以下建議,

  1. 不要將密鑰存儲在DB中,也不要對其進行硬編碼。 將其存儲在其他安全位置,例如在Windows上使用DPAPI。
  2. 確保您有密鑰版本,以便您可以旋轉密鑰以符合某些標准。
  3. 我不熟悉SQLServer中的加密。 確保它有一個隨機的初始向量。 您可以通過兩次加密相同的密碼來檢查這一點,它應該產生不同的密文。 如果沒有隨機IV,請不要使用它,只需在應用程序中對其進行加密即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM