C# 密码加密
我正在为C#中的应用程序创建登录屏幕。在我的登录屏幕中,我从数据库中读取用户名和密码,并检查输入的用户名和密码是否正确。当我从数据库读取密码时,我需要密码进行加密。有人能解释一下加密和解密是如何工作的吗C# 密码加密,c#,sql,encryption,C#,Sql,Encryption,我正在为C#中的应用程序创建登录屏幕。在我的登录屏幕中,我从数据库中读取用户名和密码,并检查输入的用户名和密码是否正确。当我从数据库读取密码时,我需要密码进行加密。有人能解释一下加密和解密是如何工作的吗 是否必须将加密值存储在数据库中以便读取 现在我有两个字段 column names: username password values: admin password 我应该将密码的加密值存储在登录表的另一个字段中吗 您可以通过多种方式
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意味着除了原始文本之外,您还添加了一些随机文本,因此,两个相同的字符串将生成不同的散列值 看看这个: 如果用户忘记了密码,您可以使用重置密码功能,许多网站都在使用该功能:
第二:您应该将users表(包含用户配置文件,如全名、DoB、地址等)和logins表(包含用户名和密码以及一些特殊属性)分开。这将导致更好的管理并降低暴露敏感信息的风险密码应以加密值存储在数据库中。当用户尝试登录时,使用相同的算法加密密码,然后将其与db中的值进行比较 Md5通常用于密码加密,因为它无法解密。如果用户忘记了密码,他将无法重新获取密码,但只能重置密码
希望这有帮助 除了给出建议外,还有其他保护密码的方法:
- 时间同步
- 反同步
当然,在中有很多关于该算法的讨论,因此,请搜索并研究更多关于该算法的信息。您是否正在实现自己的身份验证机制?您可以使用现有的System.Web.Security microsoft身份验证。通过使用成员类,您可以验证用户密码,而无需从数据库中检索密码。通过这种方式,您将能够在数据库中存储加密的密码。只需使用Membership.CreateUser和Membership.ValidateUser。
如果您不需要(性能方面的或专有的实现),请使用现有的实现并节省时间。应该是密码的盐散列,而不是加密的。您可能会提到MD5散列,但是您的方法执行DES加密。哈希更适合用作密码,因为它不能被反转。还要注意的是,它不是.NET BCL的一部分,需要单独下载。我一直认为
MD5
是hash
!(请将你的回答改为误导性的)我提到了MD5,因为它被广泛使用。虽然我已经描述了我正在使用的方法,但MD5是常用的。MD5不是加密。这是一个加密安全的散列。你的样本不使用MD5,而是使用DES。为什么会得到-1?盐渍哈希是无限的