2013-05-30 19 views
0

我试图实现在C#中计算的散列,其应该匹配哈希生成用食盐 - 等价与Perls的模块

Perl代码是下面

#!/user/bin/perl 
# 
use Digest::MD5 'md5_hex'; 

my $rawvalue = "HelloWorld"; 
my $salt = "12345678"; 
my $md5 = Digest::MD5->new; 
$md5->add($rawvalue,$salt); 

my $md5Digest = $md5->hexdigest; 
print $md5Digest; 
print "\n"; 

的由Perl的模块生成的哈希输出是:a4584f550a133a7f47cc9bafd84c9870

我已经在C#中尝试了以下方法 - 但不能实现相同的结果。

string salt = "12345678"; 
    string data = "HelloWorld"; 

    byte[] saltbyte = System.Text.Encoding.UTF8.GetBytes(salt); 
    byte[] databyte = System.Text.Encoding.UTF8.GetBytes(data); 

    //HMACMD5 
    HMACMD5 hmacmd5 = new HMACMD5(saltbyte); 
    byte[] hmacmd5hash = hmacmd5.ComputeHash(databyte); 
    StringBuilder sBuilder = new StringBuilder(); 
    for (int i = 0; i < hmacmd5hash.Length; i++) 
    { 
     sBuilder.Append(hmacmd5hash[i].ToString("x2")); 
    } 
    Console.WriteLine(sBuilder.ToString()); //outputs 2035a1ff1bf3a5ddec8445ada2e4883c 



    //HMACSHA1 
    HMACSHA1 hmacsha1 = new HMACSHA1(saltbyte); 
    byte[] hmacsha1hash = hmacsha1.ComputeHash(databyte); 
    sBuilder = new StringBuilder(); 
    for (int i = 0; i < hmacsha1hash.Length; i++) 
    { 
     sBuilder.Append(hmacsha1hash[i].ToString("x2")); 
    } 
    Console.WriteLine(sBuilder.ToString()); //outputs a8beb5b2f63c9574fea28f4c1d9e59306a007924 

作为最后的手段我可能诉诸使perl的CGI只是为了计算遗留散..但我想避免这种尽可能!

谢谢!

回答

1

它看起来像你的perl代码只是连接数据与盐,然后散列 - a4584f550a133a7f47cc9bafd84c9870只是"HelloWorld" + "12345678"的MD5。

而不是使用HMACMD5,你只需要做这样的事情,使用MD5

using (MD5 a = MD5.Create()) { 
    byte[] bytes = Encoding.UTF8.GetBytes(data + salt); 
    byte[] hashed = a.ComputeHash(bytes); 

    var sb = new StringBuilder();   
    for (int i = 0; i < hashed.Length; i++) { 
     sb.Append(hashed[i].ToString("x2")); 
    } 
    Console.WriteLine(sb.ToString()); // a4584f550a133a7f47cc9bafd84c9870 
} 
+0

谢谢了! - 帮助:) – Sekhar