繁体   English   中英

如何在SQL中比较加密的密码

[英]How to compare encrypted password in sql

我已经对密码进行了加密并将其存储在数据库中,但是现在我想将加密后的值与用户在加载页面时键入的密码进行比较。 考虑以下代码:

string userName = txtusername.Text;
string password = txtpassword.Text;
Encryptor en = new Encryptor(EncryptionAlgorithm.Rc2, CreateRandomPassword(7));
password = en.Encrypt(password);            
DataTable dt = uMManager.ValidateUser(userName, password);

CreateRandomPassword方法

private static string CreateRandomPassword(int passwordLength)
{
  string allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-";
  char[] chars = new char[passwordLength];
  Random rd = new Random();

  for (int i = 0; i < passwordLength; i++)
  {
     chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
  }
  return new string(chars);
}

加密类

public class Encryptor
    {
        EncryptEngine engin;
        public byte[] IV;

        public Encryptor(EncryptionAlgorithm algID, string key)
        {
            engin = new EncryptEngine(algID, key);
        }

        public EncryptEngine EncryptEngine
        {
            get
            {
                return engin;
            }
            set
            {
                engin = value;
            }
        }

        public string Encrypt(string MainString)
        {
            MemoryStream memory = new MemoryStream();
            CryptoStream stream = new CryptoStream(memory, engin.GetCryptTransform(), CryptoStreamMode.Write);
            StreamWriter streamwriter = new StreamWriter(stream);
            streamwriter.WriteLine(MainString);
            streamwriter.Close();
            stream.Close();
            IV = engin.Vector;
            byte[] buffer = memory.ToArray();
            memory.Close();
            return Convert.ToBase64String(buffer);

        }
    }

我做了一个本地方法来生成用于RC2加密的随机字符串。 EncryptionAlgorithm是加密类型的枚举。 现在如何将“密码”与数据库中的密码字段进行比较以检查凭据是否正确

您无法检查凭证是否正确,因为您已使用丢弃的密钥对凭证进行了加密。 如果您将密钥与密码一起存储,则加密无用。 如果不这样做,就无法验证。

与其尝试创建一种新的方式来存储密码,不如使用一种 已知的工作方式

不要加密密码。 哈希它们。 加密允许检索纯文本密码,这是一件坏事。 散列仍然允许您检查用户输入的内容是否与他之前的操作匹配。

这是程序的流程:

  • 当用户注册新帐户时->您对其密码进行加密->将其保存在数据库中
  • 用户登录时->加密输入密码->使用数据库中的密码获取用户->如果用户不为空->登录成功->其他->登录失败

似乎您每次都在使用随机密钥来加密密码

因此,如果

你第一次加密“测试”
然后您再次加密“测试”。 两次加密的结果不一样。

你应该简单地使用哈希算法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM