【问题标题】:C#: String -> MD5 -> HexC#:字符串 -> MD5 -> 十六进制
【发布时间】:2009-07-09 07:05:51
【问题描述】:

在 PHP 或 Python 等语言中,有一些方便的函数可以将输入字符串转换为输出字符串,输出字符串是它的十六进制表示。

我发现这是一项非常常见且有用的任务(密码存储和检查、文件内容校验和......),但据我所知,在 .NET 中,您只能处理字节流。

完成这项工作的功能很容易添加(例如http://blog.stevex.net/index.php/c-code-snippet-creating-an-md5-hash-string/),但我想知道我是否遗漏了什么,使用了错误的模式,或者.NET 中根本没有这样的东西。

谢谢

【问题讨论】:

  • 考虑使用 SHA-256 而不是 MD5。

标签: c# hash md5


【解决方案1】:

您链接的方法似乎正确,MSDN C# FAQ 上显示的方法略有不同

一条评论建议您可以使用:

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string, "MD5");

【讨论】:

  • 但请不要使用常见问题解答中显示的代码,因为它使用 Encoding.ASCII,因此会将所有非 ASCII 字符视为“?” - 使它成为一个非常糟糕的哈希。
【解决方案2】:

是的,您只能使用字节(据我所知)。但是您可以通过循环它们并执行以下操作轻松地将这些字节转换为它们的十六进制表示:

myByte.ToString("x2");

您可以使用以下方法获取组成字符串的字节:

System.Text.Encoding.UTF8.GetBytes(myString);

所以它可以在几行中完成。

【讨论】:

    【解决方案3】:

    一个问题是“[字符串]的十六进制表示”的概念。

    字符串是字符的序列。这些字符如何表示为单个位取决于编码。 .NET 的“本机”编码是 UTF-16,但通常使用 UTF-8 可以实现更紧凑的表示(同时保留对任何字符串进行编码的能力)。

    一旦您选择了合适的编码,您就可以使用Encoding.GetBytes 来获取字符串的编码版本 - 但事实上, 做出了这样的选择,这就是没有'许多 API 直接从字符串转换为 base64/hex,或者直接对字符串执行加密/散列。 确实存在的任何此类 API 几乎肯定会执行“编码为字节数组,执行适当的二进制操作,将不透明的二进制数据解码为 hex/base64”。

    (这让我想知道是否不值得编写一个可以采用编码、Func<byte[], byte[]> 和诸如 hex/base64 之类的输出格式的实用程序类——它可以表示应用于字符串的任意二进制操作.)

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 2018-01-31
      • 2021-07-08
      • 2017-08-12
      • 2019-02-21
      • 2010-10-04
      • 2015-05-26
      • 2012-01-24
      • 2014-03-07
      相关资源
      最近更新 更多