Silverlight中的MD5哈希

10

我正在开发一个Windows Phone 7应用程序。我正在使用此实现在silverlight中进行MD5哈希。

我正在使用以下代码 -

    protected string GetMD5Hash(string input)
    {
        byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
        MD5Managed md5 = new MD5Managed();
        byte[] hash = md5.ComputeHash(bs);

        StringBuilder sb = new StringBuilder();
        foreach (byte b in bs)
        {
            sb.Append(b.ToString("x2").ToLower());
        }

        return sb.ToString();    
    }

然而,我提供的输入没有得到正确的MD5哈希值。我不确定这段代码有什么问题。如果有人在Silverlight中使用了这个实现来进行MD5哈希,请问我哪里出错了?


1
请注意,现在 MD5 可能已经被认为是过时的 - 它是不安全的。我建议使用 SHA 系列的实现。 - Grant Thomas
你为什么认为它是错的?你拿什么进行比较?链接页面上有评论说它存在缺陷,不应该使用。 - Matt Lacey
@Mr. Disappointment,我正在使用第三方API进行开发,所以这并不由我决定。 - pavanred
@Matt Lacey 是的,我看见了那些评论。但是当我寻找替代方案时,除了自己从头开始编写程序之外,我没有找到其他可选项。即使在stackoverflow的许多帖子中,也建议使用此实现方式。我怎么知道它是错误的呢?通常情况下,MD5哈希表示为32个十六进制位的序列,但对于某些输入,我得到了更多的位数。 - pavanred
我在 Windows Phone 7 应用程序中找不到 MD5Managed。 - Cœur
MD5Managed 的命名空间是什么? - khateeb
2个回答

11
你返回的是输入的十六进制版本,而不是哈希值:
foreach (byte b in bs)
应该是这样的。
foreach (byte b in hash)

如果你不介意结果是Base64而不是16进制,另一种选择是使用Convert.ToBase64String(hash)


5
@Pavanred 好的,你可以使用橡皮鸭来停止感到愚蠢 :) http://en.wikipedia.org/wiki/Rubber_duck_debugging - Prashant Cholachagudda

4
这个问题已经有一个被接受的答案了,但是对于那些在Silverlight或Windows Phone中使用MD5的人,我会发布一个链接到另一个实现MD5的网站,Jeff Wilcox的版本,我用它更成功了。
我花了几个小时来尝试在我的Windows Phone项目中使用原始帖子中提到的实现,但是一些情况下它可以工作而其他情况下则不行。Jeff Wilcox的版本完美地解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接