C# 密码加密

C# 密码加密,c#,sql,encryption,C#,Sql,Encryption,我正在为C#中的应用程序创建登录屏幕。在我的登录屏幕中,我从数据库中读取用户名和密码,并检查输入的用户名和密码是否正确。当我从数据库读取密码时,我需要密码进行加密。有人能解释一下加密和解密是如何工作的吗 是否必须将加密值存储在数据库中以便读取 现在我有两个字段 column names: username password values: admin password 我应该将密码的加密值存储在登录表的另一个字段中吗 您可以通过多种方式

我正在为C#中的应用程序创建登录屏幕。在我的登录屏幕中,我从数据库中读取用户名和密码,并检查输入的用户名和密码是否正确。当我从数据库读取密码时,我需要密码进行加密。有人能解释一下加密和解密是如何工作的吗

  • 是否必须将加密值存储在数据库中以便读取
  • 现在我有两个字段

    column names: username         password 
    
    values:        admin            password
    
  • 我应该将密码的加密值存储在登录表的另一个字段中吗


  • 您可以通过多种方式加密密码

    其中一种方法是使用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;
    

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

    编辑:为什么不应该对密码使用加密?因为当攻击者知道加密密钥时,您所有的密码都将被公开(这非常糟糕)。如果你使用hash,他只能一个接一个地猜(这并不容易)。否则,哈希算法通常比加密更快,您将获得性能优势

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

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

    看看这个:

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

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

    这些加密的优点是什么?他们很慢!比散列算法慢得多。有了GPU的强大功能(例如,nVidia的CUDA),破解散列值现在并非不可能,而且速度慢会使破解这些加密变得更加困难

    有关bcrypt的更多信息,请访问:


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

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

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


    希望这有帮助

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

  • 一次性密码:尽管 实现salt散列、密码 仍然存储在硬盘和 容易开裂。所以一个更好的 这里需要一种方法。在里面 与静态密码相比, 每次更改一次性密码 用户登录到系统的时间 通常用户应该携带 小型硬件,用于 与服务器同步。主要是 OTP有两种类型:(访问)

    • 时间同步
    • 反同步
  • 使用BCrypt,它使用了Blowfish加密算法的密钥设置计划的一个变体,并包含一个工作因子,可以让您确定哈希函数的开销。为了熟悉bCrypt,请访问:

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


    当然,在中有很多关于该算法的讨论,因此,请搜索并研究更多关于该算法的信息。

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

    应该是密码的盐散列,而不是加密的。您可能会提到MD5散列,但是您的方法执行DES加密。哈希更适合用作密码,因为它不能被反转。还要注意的是,它不是.NET BCL的一部分,需要单独下载。我一直认为
    MD5
    hash
    !(请将你的回答改为误导性的)我提到了MD5,因为它被广泛使用。虽然我已经描述了我正在使用的方法,但MD5是常用的。MD5不是加密。这是一个加密安全的散列。你的样本不使用MD5,而是使用DES。为什么会得到-1?盐渍哈希是无限的