2016-05-28 41 views
4

我對密碼學相當陌生,並且想要讓我的頭部圍繞哈希算法。散列算法SHA256,我的方法是否安全?我如何添加一個鹽值來提高安全性

我有以下資源創建密碼的散列版本,可以存儲在我的數據庫中。

public static string hashPasswordGenerator(string password) 
    { 
     System.Security.Cryptography.SHA256Managed crypt = new System.Security.Cryptography.SHA256Managed(); 
     StringBuilder hash = new StringBuilder(); 
     byte[] cry = crypt.ComputeHash(Encoding.UTF8.GetBytes(password), 0, Encoding.UTF8.GetByteCount(password)); 
     return Convert.ToBase64String(cry); 
    } 

我的例子用戶User1與密碼Password1,這將返回的GVE/3J2k+3KkoF62aRdUjTyQ/5TVQZ4fI2PuqJ3+4d0=

我的問題哈希版本是:

  1. 這是安全的?
  2. 我應該爲此添加鹽嗎?如果是的話,有人可以顯示我 一個簡單的例子,因爲我真的不明白它是如何生成的,以便它每次都能匹配密碼?
  3. 如果有人有這個hashPasswordGenerator方法可以逆向工程我的密碼?

在此先感謝。

+0

在你的例子'StringBuilder hash = new StringBuilder();'從不使用。 – Ashigore

+0

[SHA-1安全用於密碼存儲?](http://stackoverflow.com/questions/2772014/is-sha-1-secure-for-password-storage)(SHA-256和SHA-1沒有根本的區別) –

+0

你不應該使用簡單的散列函數來散列密碼。您需要使用像PBKDF2,bcrypt,scrypt和Argon2這樣的特意緩慢的散列函數。查看更多:[如何安全地哈希密碼?](http://security.stackexchange.com/q/211/45523) –

回答

4

這種產品是否安全?

不是真的,如果你只是沒有鹽使用SHA2。 (並不是說SHA2可以很容易地逆轉)

我應該爲此添加一個鹽嗎?

是的。

如果這樣能有人告訴我一個簡單的例子

使用RNGCryptoServiceProvider

RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); 
var salt = new byte[32]; 
rngCsp.GetBytes(salt); // this will fill the buffer with random values 

,因爲我真的不明白它是如何產生這樣的鹽,它會匹配密碼每次

你必須保存鹽(每個密碼必須是唯一的)以及散列(密碼+鹽)。

如果有人有這個hashPasswordGenerator方法他們可以逆向工程我的密碼?

是的,如果這是一個字典密碼,如果你不使用鹽。否則不可以(在可預見的將來)因爲哈希值應該很難扭轉。

順便說一句,而不是試圖重新發明輪子,你應該看看使用PBKDF2您的密碼散列需求,因爲它有一個工作因素,可以減緩蠻力攻擊(迭代次數)。

+1

非常感謝您的答案。好,那麼鹽應該如何儲存這個,在一個單獨的領域,或在同一個領域。 PBLDF2上的例子有'Convert.ToBase64String(salt)+「|」 + Convert.ToBase64String(散列)'所以這是一個管道分隔字符串? – user3284707

+0

您可以將其存儲在單獨的字段中,因爲無需解析字符串就可以更容易地讀回。 – Nasreddine

+0

因此,在密碼被加密前,這個鹽值被添加到密碼中,這意味着相同的兩個密碼永遠不會相同的哈希值?所以要檢查密碼時,我查找鹽,添加明文密碼,然後散列並查看它們是否匹配? – user3284707

2

這種產品是否安全?

是的,不,不是。問題應該是「這對我的要求是否足夠安全?」,這是你只能回答的問題。

我應該爲此添加鹽嗎?

是的,你應該。

如果有人有這個hashPasswordGenerator方法,他們可以逆向工程我的密碼?

不,他們不能。在最壞的情況下,它會將他們指向正確的方向來強制蠻力。

您的解決方案的問題在於它太容易被黑客攻擊。

第一個問題顯然是缺少鹽值,這意味着如果2個用戶具有相同的密碼,他們將具有相同的散列,這使得更容易危害多個帳戶。其次,SHA256太快了,無法做出安全的密碼散列。您應該使用bcrypt或類似的方法控制輪次數,以使散列生成「緩慢」。你希望它變慢的原因是因爲你的應用程序只需要一次生成一個散列,所以如果計算上來說它沒有什麼大不了的,但它產生一個has的時間比SHA256多10000倍,但是黑客需要產生數十億的散列。因此,爲他做這個需要長達10000倍的時間是一筆巨大的交易。

+0

非常感謝您的回答,我按照建議添加了迭代,查看了PBKDF2。儘管我仍然對鹽感到困惑。如果用戶能夠獲得密碼,他們也不能掌握鹽? – user3284707

+0

@ user3284707是的,但它會大大減緩蠻力攻擊。 – Nasreddine

+0

@ user3284707這個維基百科文章有關於[how](https://en.wikipedia.org/wiki/Salt_(cryptography))的更多細節(解釋不適合堆棧溢出註釋)。 – Nasreddine

相關問題