Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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 2005 MD5哈希和C MD5哈希_C#_Sql_Sql Server 2005_Encryption - Fatal编程技术网

C# SQL 2005 MD5哈希和C MD5哈希

C# SQL 2005 MD5哈希和C MD5哈希,c#,sql,sql-server-2005,encryption,C#,Sql,Sql Server 2005,Encryption,我目前有一个遗留数据库SQL2005,它为令牌生成哈希字符串。它是这样做的 DECLARE @RowID INT DECLARE @hashString VARCHAR(128) SET @RowID = 12345 SET @salt= 0xD2779428A5328AF9 SET @hashBinary = HASHBYTES(('MD5', @salt + CAST(@RowID AS VARBINARY(30))) SET @hashString = sys.fn_varbintoh

我目前有一个遗留数据库SQL2005,它为令牌生成哈希字符串。它是这样做的

DECLARE @RowID INT
DECLARE @hashString VARCHAR(128)

SET @RowID = 12345
SET @salt= 0xD2779428A5328AF9

SET @hashBinary = HASHBYTES(('MD5', @salt + CAST(@RowID AS VARBINARY(30)))
SET @hashString = sys.fn_varbintohexstr(@hashBinary)
如果执行此操作,我的哈希字符串如下所示:0x69a947fd71b853485007f0d0be0763a5

现在,我需要在C中复制相同的逻辑,以便删除生成这些散列的数据库依赖项,并且它必须向后兼容

我在C中实现了如下内容:

byte[] saltBytes = BitConverter.GetBytes(0xD2779428A5328AF9);
byte[] pidBytes = BitConverter.GetBytes(12345);

byte[] bytesToHash = new byte[saltBytes.Length + pidBytes.Length];

for (int i = 0; i < saltBytes.Length; i++)
{
    bytesToHash[i] = saltBytes[i];
}

for (int i = 0; i < pidBytes.Length; i++)
{
    bytesToHash[saltBytes.Length + 1] = pidBytes[i];
}

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
byte[] hashedBytes = hasher.ComputeHash(bytesToHash);

string hashString = BitConverter.ToString(hashedBytes).ToLower().Replace("-", "");
问题是,我的C实现生成这个散列:715F5D63172215A1BFB2C82E4421BF

他们显然不同


那么,有可能使匹配保持一致吗?

在我看来,您的第二个循环中有一个bug。尝试将+1更改为+i

for (int i = 0; i < pidBytes.Length; i++)
{
    // the line below just overwrites the same position multiple times
    // bytesToHash[saltBytes.Length + 1] = pidBytes[i];
    bytesToHash[saltBytes.Length + i] = pidBytes[i];
}

在您的示例中,您只是多次覆盖数组中的同一位置,而不是从该点开始设置每个项。

在我看来,您的第二个循环中有一个bug。尝试将+1更改为+i

for (int i = 0; i < pidBytes.Length; i++)
{
    // the line below just overwrites the same position multiple times
    // bytesToHash[saltBytes.Length + 1] = pidBytes[i];
    bytesToHash[saltBytes.Length + i] = pidBytes[i];
}
在您的示例中,您只是多次覆盖数组中的同一位置,而不是从该点向前设置每个项目。

我已经解决了这个问题:

如果我在SQL中执行此操作:

我得到这个结果:0x0000309

现在,如果我在C中这样做:

int value = 12345;
byte[] bytes = BitConverter.GetBytes(value);
Console.Write(BitConverter.ToString(bytes))
我得到这个结果:39-30-00-00

字节的顺序似乎相反。因此,一旦我将这些字节数组应用于MD5哈希程序,我就会得到明显不同的哈希值

如果在将C字节数组放入MD5哈希程序之前将其反转,则会得到与SQL生成的哈希相同的哈希值。

我已经解决了这个问题:

如果我在SQL中执行此操作:

我得到这个结果:0x0000309

现在,如果我在C中这样做:

int value = 12345;
byte[] bytes = BitConverter.GetBytes(value);
Console.Write(BitConverter.ToString(bytes))
我得到这个结果:39-30-00-00

字节的顺序似乎相反。因此,一旦我将这些字节数组应用于MD5哈希程序,我就会得到明显不同的哈希值


如果在将C字节数组放入MD5哈希程序之前将其反转,则会得到由SQL生成的相同哈希值。

进行此更改会得到不同的哈希值,但与SQL生成的哈希值仍不相同。进行此更改会得到不同的哈希值,但与SQL生成的哈希值仍不相同。因此,经过更多调整,如果将12345字节数组作为int,将12345字节数组作为字符串,则得到的哈希值不同。此外,如果我像SQL在其强制转换中那样创建lenth 30的空白字节[],我也会得到不同的结果。那么…有一种一致的方法可以做到这一点吗?因此,经过更多的调整,如果我将12345字节数组作为int,将12345字节数组作为字符串,结果会得到一个不同的哈希值。此外,如果我像SQL在其强制转换中那样创建lenth 30的空白字节[],我也会得到不同的结果。那么…有没有一个一致的方法来做到这一点?是的,知道为什么吗?是SQL颠倒了字节顺序,还是位转换器,还是我喝了太多咖啡因?是的,知道为什么吗?是SQL颠倒了字节顺序,还是位转换器,还是我摄入了太多咖啡因?