gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 16:52:06 27 4
gpt4 key购买 nike

我正在使用 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 行的“密码”列 -- -> MySql.Data.MySqlClient.MySqlException (0x80004005):第 1 行“密码”列的字符串值不正确:“\x90]\x0E\x80\xB1\xFF...”

我尝试将数据库中的列值更改为 varbinary(从 varchar),然后我可以插入它,但它变成数据库中的一个 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));
}
}

编辑2---密码类型为byte[]

This is if I change the Password and SaltedPassword types in the database to VarBinary. When I use VarChar it gives the error which I pasted before and nothing gets sent to the DB.

Text Image

更新——已解决

所以我在 modelbuilder.entity 中的密码值错误,我在那里设置了 VarChar,而它应该是 VarBinary。不知怎的,它与 Context.Useraccount.add(User) 和 Context.SaveChanges() 一起工作。

感谢大家的帮助!

最佳答案

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

but it becomes a blob in the DB and it doesn't work when I try to read it again

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

关于c# - 使用 ExecuteSqlCommand 使我的密码在插入数据库时​​不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52763270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com