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行上生成的。

我需要用不同类型的钥匙吗?

C#密码加密

通常的做法不是加密数据库中的密码,而是对其进行散列。
当用户尝试登录时,您会获取他键入的密码,对其进行散列,并与数据库中存储的散列进行比较。

行业标准的哈希算法是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);