C#:String - > MD5 - > Hex

pis*_*hio 4 c# hash md5

在PHP或Python等语言中,有一些方便的函数可以将输入字符串转换为输出字符串,该输出字符串是HEXed的表示形式.

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

一项功能很容易上手(例如http://blog.stevex.net/index.php/c-code-snippet-creating-an-md5-hash-string/),但我想要要知道我是否遗漏了某些东西,使用了错误的模式,或者在.NET中根本没有这样的东西.

谢谢

Dyk*_*kam 7

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

评论建议你可以使用:

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string, "MD5");
Run Code Online (Sandbox Code Playgroud)

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

col*_*ium 5

是的,你只能使用字节(据我所知).但是你可以通过遍历它们并做类似的事情来轻松地将这些字节转换为它们的十六进制表示:

myByte.ToString("x2");
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令获取构成字符串的字节:

System.Text.Encoding.UTF8.GetBytes(myString);
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*eet 5

一个问题是"[字符串]的HEXed表示"的概念.

字符串是一系列字符.这些字符如何表示为单个位取决于编码..NET的"原生"编码是UTF-16,但通常使用UTF-8实现更紧凑的表示(同时保留编码任何字符串的能力).

您可以使用Encoding.GetBytes得到一个字符串的编码版本,一旦你选择了一个合适的编码-但事实证明,有这样的选择,使的原因,有没有很多的API,其直行从字符串为base64 /或十六进制它直接对字符串执行加密/散列.确实存在的任何此类API 几乎肯定会执行"编码为字节数组,执行适当的二进制操作,将不透明的二进制数据解码为hex/base64".

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