C# SQL 2005 MD5哈希和C MD5哈希
我目前有一个遗留数据库SQL2005,它为令牌生成哈希字符串。它是这样做的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
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颠倒了字节顺序,还是位转换器,还是我摄入了太多咖啡因?