2011-05-24 140 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。 如果你不需要(性能明智的或专有的实现)使用现有的实现并节省时间。