密码加密

| 我正在为C#中的应用程序创建登录屏幕。在登录屏幕上,我正在从数据库中读取用户名和密码,并检查输入的用户名和密码是否正确。从数据库读取密码时,我需要密码进行加密。谁能解释加密和解密的工作原理。 是否必须将加密值存储在数据库中才能读取。 现在我有两个领域
column names: username         password 

values:        admin            password
我是否应该将密码的加密值存储在登录表的另一个字段中?     
已邀请:
首先:现在的常用方法是存储密码的加盐哈希值,而不是存储纯文本密码本身(首选SHA-1和更好的哈希算法,请避免使用MD5,因为它不再安全了)。当用户登录时,您将重新计算输入字符串的哈希,然后将其与数据库中存储的字符串进行比较。 编辑:为什么不应该对密码使用加密?因为当攻击者知道加密密钥时,您所有的密码都将被公开(这很糟糕)。如果使用哈希,他只能一一猜出(这并不容易)。否则,通常哈希算法要比加密算法快,您将受益于性能。 编辑:为什么您应该存储盐腌的哈希,而不是哈希?因为哈希算法可以保证,如果您对相同的字符串进行哈希处理,则结果是相同的。这可能导致一个问题,当攻击者看到相同的哈希值时,他可以猜测文本是相同的,这使他有机会获得原始密码。 Salt表示除了原始文本之外,您还放置了一些随机文本,因此,两个相同的字符串将生成不同的哈希值 看看这个:http://www.obviex.com/samples/hash.aspx 如果用户忘记了密码,则可以使用许多网站正在使用的重置密码功能: 用户要求重设密码 包含特殊链接(包括秘密令牌/ PIN)的电子邮件将被发送到注册的电子邮件地址,从而允许用户重置其密码。 随机创建的密码将再次发送给用户,然后用户可以登录并更改密码。 2012年5月14日更新:答案似乎过时了,并不完全正确。人们正在使用更安全的哈希加密算法来存储密码。现在,一个著名的解决方案是bcrypt,另一个(新的很有前途的)解决方案是scrypt。 这些加密的优势?他们很慢!比散列算法慢得多。借助GPU的强大功能(例如nVidia的CUDA),破解哈希值现在已经不是不可能,而且速度缓慢会使破解这些加密变得更加困难。 您可以在以下位置找到有关bcrypt的更多信息:http://codahale.com/how-to-safely-store-a-password/ 第二:您应该分离用户表(包含用户配置文件,例如全名,DoB,地址等)和登录表(其中包含用户名和密码以及一些特殊属性)。这将导致更好的管理并降低暴露敏感信息的风险     
除了给出的建议外,还有其他保护密码的方法: 一次性密码:尽管 实现盐腌哈希,密码 仍然存储在硬盘上 容易被破解。所以更好 这里需要这种方法。在 与静态密码对比, 一次更改一次密码 用户登录系统的时间 通常,用户应携带 用于的小硬件 与服务器同步。主要是 OTP有两种类型:(使用一次性密码访问更安全的身份验证) 时间同步 逆同步 使用BCrypt,它使用Blowfish加密算法的密钥调度的变体,并且包含一个工作因子,可让您确定哈希函数的价格。为了熟悉bCrypt,请访问:http://codahale.com/how-to-safely-store-a-password/ 在C#中,可以使用BCrypt.Net库,它是iBCrypt库的端口:阅读以下文章,以了解如何在Visual Studio.Net中启动并运行该库: 在.NET应用程序中使用BCrypt –为什么它比SHA或MD5更好。 当然,SO中对此算法有很多讨论,请对此进行更多搜索和研究。     
您是否正在实现自己的身份验证机制?您可以使用已经存在的System.Web.Security微软身份验证。通过使用Membership类,您可以验证用户密码,而无需从数据库中检索它。这样,您将能够在数据库中存储加密(加密)密码。只需使用Membership.CreateUser和Membership.ValidateUser。 如果不需要(明智的性能或专有实现),请使用现有的实现并节省时间。     
密码应存储在本身具有加密值的数据库中。当用户尝试登录时,请使用相同的算法对密码进行加密,然后将其与db中的值进行比较。 Md5通常用于密码加密,因为它无法解密。如果用户忘记了密码,他将无法取回密码,而只能将其重置。 希望这可以帮助 !     
您可以通过多种方式对密码进行加密。 一种方式是使用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;
    

要回复问题请先登录注册