C#密码加密
本文关键字:加密 密码 | 更新日期: 2023-09-27 18:00:33
我在网上发现了一些代码,这些代码对我想要做的事情非常有效。我需要一些东西来加密密码,将其保存到数据库中,并轻松检索。下面的代码几乎完成了我要查找的所有内容。
string UserName = txtUser.Text;
string password = txtPass.Text;
string encrKey = "keyvalue";
byte[] byteKey = { };
byte[] IV = {25, 47, 60, 88, 99, 106, 125, 139};
byteKey = Encoding.UTF8.GetBytes(encrKey.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputArray = Encoding.UTF8.GetBytes(password);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byteKey, IV), CryptoStreamMode.Write);
cs.Write(inputArray, 0, inputArray.Length);
cs.FlushFinalBlock();
password = Convert.ToBase64String(ms.ToArray());
SqlCommand cmd = new SqlCommand("INSERT INTO USers (UserName, Password) VALUES (@UserName, @Password)", myConnection);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@UserName", UserName);
cmd.Parameters.AddWithValue("@Password", password);
SqlDataReader rdr = cmd.ExecuteReader();
我遇到的问题是,当密码为8个字符或更长时,代码会出错。我得到这个错误:
System.Security.Cryptography.CryptographicException:指定的密钥大小对此算法无效。错误是在Cryptostream行上生成的。
我需要用不同类型的钥匙吗?
通常的做法不是加密数据库中的密码,而是对其进行散列。
当用户尝试登录时,您会获取他键入的密码,对其进行散列,并与数据库中存储的散列进行比较。
行业标准的哈希算法是SHA-1,它可以在.NET.中使用
为了更大的安全性,你在哈希中使用了"盐"。
你可以在这里阅读更多关于它的信息:Salting Your Password:Best Practices?
如果您需要实际反向加密,只需使用ProtectedData类:http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx
如果这里的其他人是正确的,请使用下面的示例类中的salted hash。以下内容摘自"如何存储盐水密码哈希的另一个示例"
public sealed class PasswordHash
{
const int SaltSize = 16, HashSize = 20, HashIter = 10000;
readonly byte[] _salt, _hash;
public PasswordHash(string password)
{
new RNGCryptoServiceProvider().GetBytes(_salt = new byte[SaltSize]);
_hash = new Rfc2898DeriveBytes(password, _salt, HashIter).GetBytes(HashSize);
}
public PasswordHash(byte[] hashBytes)
{
Array.Copy(hashBytes, 0, _salt = new byte[SaltSize], 0, SaltSize);
Array.Copy(hashBytes, SaltSize, _hash = new byte[HashSize], 0, HashSize);
}
public PasswordHash(byte[] salt, byte[] hash)
{
Array.Copy(salt, 0, _salt = new byte[SaltSize], 0, SaltSize);
Array.Copy(hash, 0, _hash = new byte[HashSize], 0, HashSize);
}
public byte[] ToArray()
{
byte[] hashBytes = new byte[SaltSize + HashSize];
Array.Copy(_salt, 0, hashBytes, 0, SaltSize);
Array.Copy(_hash, 0, hashBytes, SaltSize, HashSize);
return hashBytes;
}
public byte[] Salt { get { return (byte[])_salt.Clone(); } }
public byte[] Hash { get { return (byte[])_hash.Clone(); } }
public bool Verify(string password)
{
byte[] test = new Rfc2898DeriveBytes(password, _salt, HashIter).GetBytes(HashSize);
for (int i = 0; i < HashSize; i++)
if (test[i] != _hash[i])
return false;
return true;
}
}
哈希密码比加密要好得多。您将密码的散列存储在数据库中,而不再关心普通文本密码。当用户登录时,您获取普通文本密码,对其进行散列,并比较两个散列(即数据库中的散列和您根据用户输入进行散列的散列)以进行身份验证。这里的明显好处是,你可以确保没有人——无论他访问数据库的原因是什么——会知道原始密码(理论上)。
我建议你使用bcrypt。源代码位于http://code.google.com/p/bcryptnet/下载并使用它。但在使用它之前。阅读文档并了解它的工作原理以及为什么使用bcrypt。。。这很重要。
通过我几周来对密码加密的研究。我终于找到了这个最适合我需要的bcrypt。(我认为这是最适合密码的,如果我错了,请纠正我)
它是单向加密。就像很少有程序员说的那样,对它进行散列和比较,但不解密。
希望这对你有所帮助。如果你发现一些有趣的事情,请让我知道XD和平~~
如果我说错了,请纠正我XD
试试这个:
var hash = Encoding.ASCII.GetBytes(password);
var sha1 = new SHA1CryptoServiceProvider();
var sha1hash = sha1.ComputeHash(hash);
var hashedPassword = Encoding.ASCII.GetString(sha1hash);