繁体   English   中英

使用ExecuteSqlCommand会使我的密码在插入数据库时​​不起作用

[英]Using ExecuteSqlCommand makes my password not work when inserting to DB

我正在使用MySql DB并尝试在那里创建用户。 密码是一个哈希。 当我使用Context.Useraccount.add(User)和Context.SaveChanges()时,添加到数据库的效果很好,但是使用ExecuteSqlCommmand会使密码不起作用。

var sql = @"INSERT INTO useraccount
           (UserId,UserName,Password,CustomerId,PasswordSalt,CreatedDate)
                VALUES
                (@UserId, @UserName,@Password,@CustomerId, @PasswordSalt, @CreatedDate)";

        int rows = _context.Database.ExecuteSqlCommand(
                sql,
                new MySqlParameter("@UserId", user.UserId),
                new MySqlParameter("@UserName", user.UserName),
                new MySqlParameter("@Password", user.Password),
                new MySqlParameter("@CustomerId", user.CustomerId),
                new MySqlParameter("@PasswordSalt", user.PasswordSalt),
                new MySqlParameter("@CreatedDate", MySQLFormatDate));

它给出了以下异常:{MySql.Data.MySqlClient.MySqlException(0x80004005):不正确的字符串值:'\\ x90] \\ x0E \\ x80 \\ xB1 \\ xFF ...'对于第1行的'Password'列---> MySql .Data.MySqlClient.MySqlException(0x80004005):不正确的字符串值:'\\ x90] \\ x0E \\ x80 \\ xB1 \\ xFF ...'位于第1行的'Password'列

我尝试将数据库中的Column值更改为varbinary(从varchar),然后可以将其插入,但是它在DB中成为一个blob,当我再次尝试读取它时不起作用。

如何将哈希正确发送到数据库?

编辑---用于创建哈希的代码

 private static void CreatePasswordHash(string password, out byte[] passwordHash, out byte[] passwordSalt)
    {
        if (password == null) throw new ArgumentNullException("password");
        if (string.IsNullOrWhiteSpace(password)) throw new ArgumentException("Value cannot be empty or whitespace only string.", "password");

        using (var hmac = new System.Security.Cryptography.HMACSHA512())
        {
            passwordSalt = hmac.Key;
            passwordHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
        }
    }

edit2 ---密码类型为byte []

这是如果我将数据库中的Password和SaltedPassword类型更改为VarBinary。 当我使用VarChar时,它给出了我之前粘贴的错误,并且没有任何内容发送到DB。

文字图片

更新-解决

所以我在modelbuilder.entity中输入的密码错误,应该是VarBinary。 它以某种方式与Context.Useraccount.add(User)和Context.SaveChanges()一起工作。

感谢大家的帮助!

从这个答案中解释答案,因为它也适用于您的情况

尝试通过JDBC将UTF-8插入MySQL时出现“字符串值错误”的问题?

MySql的utf8编码仅支持可以3字节编码的字符。 无论什么字符'\\ x90] \\ x0E \\ x80 \\ xB1 \\ xFF'都需要花费3个以上的字节来编码,这就是MySql向您大吼大叫的原因。

验证用于编码这些密码的任何方法都限于utf8格式,并且应防止再次发生此错误。

我看不到您的用于散列这些内容的方法,但这将确保您使用utf8进行编码

   byte[] salt = // Salt
   byte[] encodedValue = Encoding.UTF8.GetBytes(value);
   byte[] saltedValue = value.Concat(salt).ToArray();
   byte[] hashedValue = SHA256Managed().ComputeHash(saltedValue);

密码哈希是字节数组,不能存储在C#字符串中。 它们也必须存储在数据库的BINARY (或VARBINARY )列中,而不是VARCHAR列中。

但是它在数据库中变成了斑点,当我尝试再次读取它时它不起作用

要验证用户的密码,您应该读回密码salt(作为byte[] ),用相同的salt对(纯文本)密码进行哈希处理,然后将新生成的哈希与从数据库中检索到的密码哈希进行比较(如一个byte[] )。 不要尝试将密码哈希转换回C# string

暂无
暂无

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

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