C# SQL Server存储过程在C和Management Studio中的散列方式不同
我正在调用一个存储过程来创建和散列一个新密码。正在从.NET/C WebAPI控制器调用它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
_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