从一个string计算一个MD5散列

我使用下面的C#代码从string计算MD5散列。 它工作正常,并生成一个32字符的hexstring,如下所示: 900150983cd24fb0d6963f7d28e17f72

 string sSourceData; byte[] tmpSource; byte[] tmpHash; sSourceData = "MySourceData"; //Create a byte array from source data. tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource); // and then convert tmpHash to string... 

有没有办法使用这样的代码生成16个字符的hexstring(或12个字符的string)? 一个32字符的hexstring是好的,但我认为这将是无聊的客户input代码!

我find了创buildMD5散列的方法

  public static string CreateMD5(string input) { // Use input string to calculate MD5 hash using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) { byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes); // Convert the byte array to hexadecimal string StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("X2")); } return sb.ToString(); } } 

来源: MD5类

 // given, a password in a string string password = @"1234abcd"; // byte array representation of that string byte[] encodedPassword = new UTF8Encoding().GetBytes(password); // need MD5 to calculate the hash byte[] hash = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(encodedPassword); // string representation (similar to UNIX format) string encoded = BitConverter.ToString(hash) // without dashes .Replace("-", string.Empty) // make lowercase .ToLower(); // encoded contains the hash you are wanting 

完全取决于你想要达到的目标。 从技术上讲,你可以从MD5散列的结果中取前12个字符,但是MD5的规格是产生32个字符。

减小哈希的大小会降低安全性,并增加碰撞和系统被破坏的可能性。

也许如果你让我们更多地了解你正在努力实现的目标,我们可能会提供更多的帮助。

您可以使用Convert.ToBase64String将MD5的16个字节的输出转换为一个〜24个字符的string。 稍微好一点,不要降低安全性。 (对于你的例子, j9JIbSY8HuT89/pwdC8jlw==

一个MD5散列是128位,所以你不能用hex表示它less于32个字符…

正在尝试使用LINQ创buildMD5哈希的string表示,但是,没有任何答案是LINQ解决scheme,因此将其添加到可用解决scheme的大杂烩中。

 string result; using (MD5 hash = MD5.Create()) { result = String.Join ( "", from ba in hash.ComputeHash ( Encoding.UTF8.GetBytes(observedText) ) select ba.ToString("x2") ); } 

我想最好在stringMD5中使用UTF-8编码。

 public static string MD5(this string s) { using (var provider = System.Security.Cryptography.MD5.Create()) { StringBuilder builder = new StringBuilder(); foreach (byte b in provider.ComputeHash(Encoding.UTF8.GetBytes(s))) builder.Append(b.ToString("x2").ToLower()); return builder.ToString(); } } 
 System.Text.StringBuilder hash = new System.Text.StringBuilder(); System.Security.Cryptography.MD5CryptoServiceProvider md5provider = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] bytes = md5provider.ComputeHash(new System.Text.UTF8Encoding().GetBytes(YourEntryString)); for (int i = 0; i < bytes.Length; i++) { hash.Append(bytes[i].ToString("x2")); //lowerCase; X2 if uppercase desired } return hash.ToString(); 
 StringBuilder sb= new StringBuilder(); for (int i = 0; i < tmpHash.Length; i++) { sb.Append(tmpHash[i].ToString("x2")); }