2011-05-24 138 views
3

我正在爲C#中的應用程序創建登錄屏幕。在我的登錄屏幕中,我正在讀取數據庫中的用戶名和密碼,並檢查輸入的用戶名和密碼是否正確。我在閱讀數據庫的密碼時需要密碼進行加密。任何人都可以解釋加密和解密是如何工作的。密碼加密

  1. 是否需要將加密值存儲在數據庫中才能讀取。
  2. 現在我有兩個字段

    column names: username   password 
    
    values:  admin   password 
    
  3. 我應該在另一個領域存儲在登錄表中的密碼的加密值?

+7

應該是密碼的鹽漬散列,而不是加密的。 – 2011-05-24 05:43:56

+2

[Password Encryption]的可能重複(http://stackoverflow.com/questions/5322055/password-encryption) – 2011-05-24 05:44:47

回答

14

第一:常用的方法是現在那家店密碼的鹽漬哈希值,而不是明文密碼本身(SHA-1和更好的散列算法是首選,避免MD5,因爲它不是安全的任何更多)。當用戶登錄時,您將重新計算輸入字符串的散列值,然後將其與存儲在數據庫中的字符串進行比較。

編輯:爲什麼你不應該使用加密密碼?因爲當攻擊者知道加密密鑰時,你所有的密碼都會被暴露(這很糟糕)。如果你使用散列,他可以一個一個地猜測(這很不容易)。否則,散列算法通常會比加密更快,您將獲得性能優勢。

編輯:爲什麼你應該存儲鹽醃散列,而不是散列?因爲散列算法可以保證如果你散列相同的字符串,結果是一樣的。這可能會導致一個問題,那就是當攻擊者看到相同的散列值時,他可以猜測文本是一樣的,這給他機會讓他得到原始密碼。

鹽意味着除了原來的文本,你把一些隨機文本,因此,兩個相同的字符串將產生不同哈希值

看看這個:http://www.obviex.com/samples/hash.aspx

在的情況下,用戶忘記了密碼,可以使用重置密碼的功能,很多網站都在使用它:

  1. 用戶請求一個密碼重置
  2. 電子郵件包含一個特殊鏈接(包括一個祕密令牌/ PIN)將被髮送到註冊的電子郵件地址,允許用戶重置他的密碼。
  3. 隨機創建的密碼將再次發送給用戶,然後他可以登錄並更改密碼。

更新2012年5月14日:答案似乎過時了,並不完全正確。人們正在轉向更安全的哈希加密算法來存儲密碼。現在有一個值得注意的解決方案是bcrypt,另一個(新的和有前途的)是scrypt。

這些加密的優勢在哪裏?他們很慢!比散列算法慢很多。用GPU(例如,從CUDA nVidia的)的功率,開裂的散列值現在還不是不可能的,並且緩慢可以使它更難破解這些加密。

你可以找到更多關於bcrypt:http://codahale.com/how-to-safely-store-a-password/

二:你應該分開用戶表(包含用戶個人資料,如姓名,出生日期,地址,...)和登錄表(包含用戶名稱和密碼以及一些特殊屬性)。這將導致更好的管理和降低暴露敏感信息

+0

爲什麼這會得到-1?醃製哈希比加密/解密更安全。 – 2011-05-24 05:55:26

+0

不知道,但SHA-1不安全,使用PKDBF2或bcrypt,這兩種算法都有內置的鹽。 – 2011-07-20 21:48:20

-3

您可以用多種方式加密密碼。

其中一種方法是使用MD5加密。讓我告訴你我正在使用的一種加密方法。

#region Encrypt 
public string Encrypt(string simpletext, string keys) 
{ 
    try 
    { 
     XCryptEngine xe = new XCryptEngine(); 

     xe.Algorithm = XCrypt.XCryptEngine.AlgorithmType.DES; //DES = Data Encryption Standard 

     string cipher = xe.Encrypt(simpletext, keys); 
     if (cipher != null) 
      return (cipher); 
     else 
      return null; 
    } 

    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 
#endregion 

#region Decrypt 
public string Decrypt(string simpletext, string keys) 
{ 
    try 
    { 
     XCryptEngine xe = new XCryptEngine(); 

     xe.Algorithm = XCrypt.XCryptEngine.AlgorithmType.DES; 

     //Console.WriteLine(xe.Decrypt(simpletext, keys)); 
     simpletext = simpletext.Replace(" ", "+"); 
     string cipertext = xe.Decrypt(simpletext, keys); 
     if (cipertext != null) 
      return (cipertext); 
     else 
      return null; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 
#endregion 

您需要使用XCrypt的參考才能使用它。

using XCrypt; 
+0

您提到了MD5哈希,但是您的方法執行DES加密。散列對於密碼更好,因爲它不能被顛倒。另請注意,[XCrypt](http://www.codeproject.com/KB/security/xcrypt.aspx)不是.NET BCL的一部分,需要單獨下載。 – 2011-05-24 05:53:49

+0

我一直以爲'MD5'是'hash'!(請將你的答案改爲**誤導性**) – V4Vendetta 2011-05-24 05:55:16

+0

那麼我提到了MD5,因爲它被大量使用。雖然我描述了我正在使用的方法,但通常使用MD5。 – 2011-05-24 05:55:25

-1

密碼應被存儲在加密值本身數據庫的風險。當用戶嘗試登錄時,使用相同的算法對密碼進行加密,然後將其與db中的值進行比較。

MD5是通常用於密碼加密,因爲它不能被解密。當用戶忘記密碼時,他不能回收它,但它只能被重置。

希望這會有所幫助!

+0

'加密'和'哈希'和兩個不同的東西使用不同的算法,不要混合它向上 – V4Vendetta 2011-05-24 05:59:44

1

隨着給出建議,還有其他的方法來保護密碼:

  1. 一次性密碼:儘管 實施鹽漬哈希密碼 仍然存儲在硬盤和 易於被破解。因此,這裏需要一個更好的辦法 。 與靜態密碼對比, 一次性密碼每次更改 用戶登錄到系統 ,通常用戶應攜帶一個 用於與服務器同步的小型硬件 。主要 有兩種類型OTP的:(訪問Safer Authentication with a One-Time Password

    • 時間同步
    • 反同步
  2. 使用BCrypt它使用Blowfish加密算法的密鑰調度的變體,包含一個工作因子,它可以讓你確定散列函數的價格是多少。爲了熟悉bCrypt,請訪問:http://codahale.com/how-to-safely-store-a-password/

在C#中,你可以使用BCrypt.Net庫,它是iBCrypt庫的端口:閱讀下面的文章來了解如何獲得這個庫啓動並運行在Visual Studio.Net:

Using BCrypt in a .NET Application – Why it’s better than SHA or MD5.

當然,也有很多的SO關於這個算法的討論,搜索和學習更多關於這一點。

0

您是否正在實施自己的認證機制?您可以使用已有的System.Web.Security微軟認證。通過使用Membership類,您可以驗證用戶密碼而不從數據庫中檢索它。通過這種方式,您將能夠將鹽漬(加密)密碼存儲在數據庫中。只需使用Membership.CreateUser和Membership.ValidateUser。 如果你不需要(性能明智的或專有的實現)使用現有的實現並節省時間。