密码加密
本文关键字:加密 密码 | 更新日期: 2023-09-27 17:57:42
我正在用C#为一个应用程序创建一个登录屏幕。在我的登录屏幕上,我正在从数据库中读取用户名和密码,并检查输入的用户名和密码是否正确。当我从数据库中读取密码时,我需要密码进行加密。有人能解释加密和解密是如何工作的吗。
- 是否必须将加密的值存储在数据库中以供读取
-
现在我有两个字段
column names: username password values: admin password
-
我应该将密码的加密值存储在登录表的另一个字段中吗?
首先:现在常见的方法是存储密码的加盐哈希,而不是纯文本密码本身(首选SHA-1和更好的哈希算法,避免MD5,因为它不再安全)。当用户登录时,您将重新计算输入字符串的哈希值,然后将其与数据库中存储的字符串进行比较。
编辑:为什么不应该使用加密的密码?因为当攻击者知道加密密钥时,你们所有人的密码都会暴露出来(这很糟糕)。如果你使用hash,他只能一个接一个地猜测(这并不容易)。否则,哈希算法通常比加密更快,您将从性能上获益。
编辑:为什么你应该储存腌杂碎,而不是杂碎?因为哈希算法可以保证,如果对相同的字符串进行哈希,结果是相同的。这可能会导致一个问题,即当攻击者看到相同的哈希值时,他可以猜测文本是相同的,这为他获得原始密码提供了机会。
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/
第二:您应该将users表(包含用户配置文件,如全名、DoB、地址等)和logins表(其中包含用户名和密码以及一些特殊属性)分开。这将带来更好的管理并降低暴露敏感信息的风险
除了给出的建议外,还有其他保护密码的方法:
-
一次性密码:尽管实现salted hash,密码仍存储在硬盘上容易破裂。所以更好这里需要一种方法。在里面与静态密码相比,每次更改一次性密码用户登录系统的时间通常用户应该携带用于正在与服务器同步。主要地有两种类型的OTP:(使用一次性密码访问更安全的身份验证)
- 时间已同步
- 计数器已同步
-
使用BCrypt,它使用Blowfish加密算法的密钥调度的变体,并包含一个功因子,可以让您确定哈希函数的成本。要熟悉BCrypt请访问:http://codahale.com/how-to-safely-store-a-password/
在C#中,您可以使用BCrypt.Net库,它是iBCrypt库的一个端口:阅读以下文章以了解如何在VisualStudio.Net中启动并运行此库:
在.NET应用程序中使用BCrypt–为什么它比SHA或MD5更好。
当然,在SO中也有很多关于该算法的讨论,对此进行了更多的搜索和研究。
您是否正在实现自己的身份验证机制?您可以使用现有的System.Web.Security microsoft身份验证。通过使用Membership类,您可以验证用户密码,而无需从数据库中检索。通过这种方式,您将能够在数据库中存储salted(加密)密码。只需使用Membership.CreateUser和Membership.ValidateUser。如果您不需要(性能方面或专有实现),请使用现有的实现并节省时间。
密码应存储在数据库中,并带有加密值。当用户尝试登录时,使用相同的算法加密密码,然后将其与数据库中的值进行比较。
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;