尝试匹配c#和nodejs加密之间的SHA512哈希

时间:2014-02-03 23:41:15

标签: c# node.js hash cryptography sha512

给出以下c#代码。

    public static string HashSHA512( string phrase )
    {
        if( m_SHA512HashProvider == null )
            m_SHA512HashProvider = new SHA512CryptoServiceProvider();

        if ( m_HashBuffer == null )
            m_HashBuffer = new byte[512];

        int length = Encoding.ASCII.GetBytes( phrase, 0, phrase.Length > 512 ? 512 : phrase.Length, m_HashBuffer, 0 );
        byte[] hashed = m_SHA512HashProvider.ComputeHash( m_HashBuffer, 0, length );

        return BitConverter.ToString( hashed );         
    }

以及以下nodejs代码

  generate: function(input, cb){
    var hash = Crypto.createHash('sha512').update(input).digest('hex');
    console.log('crypto generate:', hash);
    return cb(hash);
  },

我的哈希不匹配。如何更改任何一方以使它们相应匹配?

1 个答案:

答案 0 :(得分:2)

您的C#代码中存在多个错误 比较以下内容并尝试确定故障的确切位置。

public static string HashSHA512( string phrase )
{
  if( m_SHA512HashProvider == null )
    m_SHA512HashProvider = new SHA512CryptoServiceProvider();

  byte[] hashed = m_SHA512HashProvider.ComputeHash(Encoding.UTF8.GetBytes(phrase)); // or ASCII if that's sufficient for you input data.

  return BitConverter.ToString( hashed );         
}

一些提示:

  • 使用UTF8代替ASCII(某些字符可能会被截断)
  • GetBytes不会返回任何内容。它返回一个字节数组。
  • ComputeHash没有outref参数,因为m_HashBuffer不包含任何内容,如果m_HashBuffer为空,则始终计算哈希值什么都没有。

修改
看一下node.js API,似乎在C#中你需要做一个额外的步骤:

return BitConverter.ToString(hashed).Replace("-", "").ToLower();

这是因为digest方法不添加连字符,所有字符都是小写。

免责声明:未对代码进行测试。