C# Hash SHA256Managed 不等于 TSQL SHA2_256

标签 c# sql-server tsql encoding hash

我正在使用加盐(用户名)的散列密码。

问题是 c# 的散列值不等于我通过 TSQL 脚本添加到数据库的初始值。

TSQL:

UPDATE [Users]
SET Password = HASHBYTES('SHA2_256', 'test123'+UPPER([UserName]))
GO;

C#:

var passBytes = new UnicodeEncoding().GetBytes(pass);
var saltBytes = new UnicodeEncoding().GetBytes(userName.ToUpper());

var dataToHash = new byte[passBytes.Length + saltBytes.Length];
Array.Copy(passBytes, dataToHash, passBytes.Length);
Array.Copy(saltBytes, dataToHash, saltBytes.Length);

var sha = new SHA256Managed();
return sha.ComputeHash(dataToHash);

我想这与编码有关。 但我不知道如何解决这个问题。

用户名是 varchar(50)

数据库是现有的,因此更改 varchar 不会那么容易。

我已经试过了:

UPDATE [Users]
SET Password = HASHBYTES('SHA2_256', N'test123'+UPPER([UserName]))
GO;

最佳答案

在努力让它工作之后,这是我最终开始工作的示例:

public string Hash(string input)
    {
        using (SHA256 hasher = SHA256.Create())
        {
            // Convert the input string to a byte array and compute the hash.
            byte[] data = hasher.ComputeHash(Encoding.Unicode.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("X2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }
    }

数据库

declare @input as nvarchar(max) = 'Test';

select @input;

declare @hash as varbinary(max) = HASHBYTES('SHA2_256', @input );

select @hash;

declare @result as nvarchar(max) = CONVERT(NVARCHAR(MAX), @hash, 2);

select @result;

这些将产生相同的结果。

请注意,这是使用 nvarchar 数据类型,而不是 varchar。

关于C# Hash SHA256Managed 不等于 TSQL SHA2_256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19212733/

相关文章:

c# - SQL 输出存储过程不适用于 ExecuteReader

sql - 返回受更新查询影响的所有主键

c# - 如何搜索特定的结构值?也许更好的方法?

c# - 将 UTC 转换为本地时间返回奇怪的结果

mysql - 选择与总和不同

sql - 如何在聚合函数 SQL Server 中有一个 where 子句

SQL 事务不工作

sql - 带有可变种子的 DATEDIFF

c# - Newbie Q 关于使用引用和泛型

C# 将 AVRO 转换为 JSON