Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server存储过程在C和Management Studio中的散列方式不同_C#_Sql Server_Stored Procedures_Asp.net Web Api - Fatal编程技术网

C# SQL Server存储过程在C和Management Studio中的散列方式不同

C# SQL Server存储过程在C和Management Studio中的散列方式不同,c#,sql-server,stored-procedures,asp.net-web-api,C#,Sql Server,Stored Procedures,Asp.net Web Api,我正在调用一个存储过程来创建和散列一个新密码。正在从.NET/C WebAPI控制器调用它 _sqlDataContext.ExecuteCommand("[Users].[SetNewPassword]", new List<SqlParameter> { new SqlParameter("@UserId", SqlDbType.UniqueIdentifier) { Value = user.Id }, new SqlParameter("@Pass

我正在调用一个存储过程来创建和散列一个新密码。正在从.NET/C WebAPI控制器调用它

_sqlDataContext.ExecuteCommand("[Users].[SetNewPassword]", new List<SqlParameter>
{
       new SqlParameter("@UserId", SqlDbType.UniqueIdentifier) { Value = user.Id },
       new SqlParameter("@Password", SqlDbType.NVarChar, 256) { Value = command.Password }
});
当我从WebAPI/C方法调用它时,得到的哈希值与直接在SQLServerManagementStudio中执行存储过程时得到的哈希值不同

此外,如果我从C执行SetPassword存储过程,下面验证密码的存储过程ValidatePassword将失败

这是因为数据库中存储的哈希与ValidatePassword生成的哈希不匹配

ALTER PROC[Users].[ValidatePassword] @用户标识唯一标识符, @密码NVARCHAR256 像 开始 声明@PasswordHash binary64=HASHBYTES'SHA2_512',从密码p中选择@Password+CASTSELECT p.PasswordSalt,其中p.UserId=@UserId为NVARCHAR256 选择 案例 当存在时,选择UserId 来自密码 其中UserId=@UserId 密码=@PasswordHash 那么1 其他0 终止 选择@passwordHash; 终止 问题:

为什么从C调用存储过程时生成的哈希与从SQLServerManagementStudio中生成的哈希不同?是否存在unicode/二进制转换或类似问题


请注意,我很欣赏“滚动您自己的”授权并不总是一个好主意,但这是解决遗留应用程序的临时问题。

很有趣。只是想确认一下——您是说它在没有salt的情况下生成的哈希值是不同的,这取决于存储过程的执行位置。不知道这是否是文本编码问题或类似问题。您是否尝试过其他算法,如MD5?我无法在我的SQL server上重现您的问题。我已经尝试过Md5和sha2_512:SSMS:选择casthashbytes'sha2_512',将'foo'作为uniqueidentifier=6EBAFBF7-3606-90F8-E56F-BBF3283E524C,并选择linq:var res=db.ExecuteQuery选择casthashbytes'sha2_512',将'foo'作为uniqueidentifier;=6ebafbf7-3606-90f8-e56f-BBF3283E524C相关。只是想确认一下——您是说它在没有salt的情况下生成的哈希值是不同的,这取决于存储过程的执行位置。不知道这是否是文本编码问题或类似问题。您是否尝试过其他算法,如MD5?我无法在我的SQL server上重现您的问题。我已经尝试过Md5和sha2_512:SSMS:选择casthashbytes'sha2_512',将'foo'作为uniqueidentifier=6EBAFBF7-3606-90F8-E56F-BBF3283E524C,并选择linq:var res=db.ExecuteQuery选择casthashbytes'sha2_512',将'foo'作为uniqueidentifier;=6ebafbf7-3606-90f8-e56f-bbf3283e524c