密码加密

时间:2011-05-24 05:42:35

标签: c# sql encryption

我正在为C#中的应用程序创建登录屏幕。在我的登录屏幕中,我正在从数据库中读取用户名和密码,并检查输入的用户名和密码是否正确。我在从数据库中读取密码时需要密码加密。任何人都可以解释加密和解密的工作原理。

  1. 是否必须将加密值存储在数据库中以供阅读。
  2. 现在我有两个字段

    column names: username         password 
    
    values:        admin            password
    
  3. 我应该将密码的加密值存储在登录表的其他字段中吗?

5 个答案:

答案 0 :(得分:14)

首先:现在常见的方法是存储密码的盐渍哈希,而不是纯文本密码本身(首选SHA-1和更好的哈希算法,避免使用MD5,因为它不再安全)。用户登录时,重新计算输入字符串的哈希值,然后将其与存储在数据库中的字符串进行比较。

编辑:为什么不使用加密密码?因为当攻击者知道加密密钥时,所有密码都会暴露出来(这非常糟糕)。如果你使用哈希,他就可以逐个猜测(这并不容易)。否则,哈希算法通常比加密更快,您将获得性能优势。

编辑:为什么你应该存储salted哈希,而不是哈希?因为散列算法可以保证,如果您散列相同的字符串,结果是相同的。这可能会导致问题是,当攻击者看到相同的哈希值时,他可以猜测文本是相同的,这使他有机会获得原始密码。

Salt意味着除了原始文本之外,您还会添加一些随机文本,因此,两个相同的字符串将生成不同的哈希值

看看这个:http://www.obviex.com/samples/hash.aspx

如果用户忘记了密码,您可以使用许多网站正在使用的重置密码功能:

  1. 用户请求重置密码
  2. 包含特殊链接(包括秘密令牌/ PIN)的电子邮件将发送到注册的电子邮件地址,允许用户重置其密码。
  3. 随机创建的密码将再次发送给用户,然后他可以登录并更改密码。
  4. 更新2012年5月14日:答案似乎很旧,并非完全正确。人们正在转向更安全的哈希加密算法来存储密码。现在值得注意的解决方案之一是bcrypt,另一个(新的和有希望的)是scrypt。

    这些加密的优势是什么?他们很慢!比哈希算法慢得多。凭借GPU的强大功能(例如,来自nVidia的CUDA),现在破解哈希值并非不可能,而且缓慢可能会使破解这些加密变得更加困难。

    您可以在http://codahale.com/how-to-safely-store-a-password/

    找到有关bcrypt的更多信息

    第二:您应该将users表(包含用户配置文件,如全名,DoB,地址,...)和登录表(包含用户名和密码以及一些特殊属性)分开。这将导致更好的管理并降低暴露敏感信息的风险

答案 1 :(得分:1)

除了给定的建议外,还有其他保护密码的方法:

  1. 一次性密码:尽管如此 实施盐渍哈希,密码 仍然存储在硬盘上 很容易被破解。所以更好 这里需要方法。在 与静态密码相比, 每次更改一次性密码 用户登录系统的时间 通常用户应携带一个 用于的小型硬件 与服务器同步。主要 有两种类型的OTP :(访问Safer Authentication with a One-Time Password

    • 时间同步
    • 反同步
  2. 使用BCrypt,它使用Blowfish加密算法的键控时间表的变体并包含一个工作因子,可以让您确定哈希函数的成本。要熟悉bCrypt,请访问:http://codahale.com/how-to-safely-store-a-password/

  3. 在C#中,您可以使用BCrypt.Net库,它是iBCrypt库的一个端口:阅读以下文章,了解如何在Visual Studio.Net中启动并运行该库:

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

    当然,在SO中有很多关于这个算法的讨论,搜索和研究更多。

答案 2 :(得分:0)

您是否正在实施自己的身份验证机制?您可以使用现有的System.Web.Security微软身份验证。通过使用Membership类,您可以验证用户密码,而无需从数据库中检索它。这样,您就可以将salted(加密)密码存储在数据库中。只需使用Membership.CreateUser和Membership.ValidateUser。 如果您不需要(性能明智或专有实现),请使用现有实现并节省时间。

答案 3 :(得分:-1)

密码应存储在具有加密值的数据库中。当用户尝试登录时,使用相同的算法加密密码,然后将其与db。中的值进行比较。

Md5通常用于密码加密,因为它无法解密。如果用户忘记了密码,他就无法将其恢复,但只能重置密码。

希望这有帮助!

答案 4 :(得分:-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;