代码之家  ›  专栏  ›  技术社区  ›  ctorx

SQL 2005 MD5哈希和C MD5哈希

  •  1
  • ctorx  · 技术社区  · 17 年前

    我目前有一个遗留数据库(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实现生成了这个哈希:“715f5d6341722115a1bfb2c82e4421bf”

    它们明显不同。

    那么,是否可以始终如一地进行匹配呢?

    2 回复  |  直到 17 年前
        1
  •  3
  •   Scott Ivey    17 年前

    在我看来你的第二个循环中有一个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];
    }
    

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

        2
  •  1
  •   ctorx    17 年前

    我已经解决了这个问题:

    如果我在SQL中这样做:

    DECLARE @Value INT
    SET @Value = 12345
    
    SELECT sys.fn_varbintohexstr(CAST(@Value AS VARBINARY(30)))
    

    我得到这个结果:0x0003039

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

    int value = 12345;
    byte[] bytes = BitConverter.GetBytes(value);
    Console.Write(BitConverter.ToString(bytes))
    

    我得到这个结果:39-30-00-00

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

    如果在将C字节数组放入MD5散列器之前反转它,我会得到由SQL生成的相同散列。

    推荐文章