2017-10-04 58 views
-5

我看到這一段代碼在 github這是如何讓我們使用加密函數進行散列?

public static string CalculateSignature(string text, string secretKey) 
{ 
    using (var hmacsha512 = new HMACSHA512(Encoding.UTF8.GetBytes(secretKey))) 
    { 
     hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(text)); 
     return string.Concat(hmacsha512.Hash.Select(b => b.ToString("x2")).ToArray()); // minimalistic hex-encoding and lower case 
    } 
} 

這是什麼代碼呢?

string.Concat(hmacsha512.Hash.Select(b => b.ToString("x2")) 

據我所知,你不能傳遞一個字符串到tostring()方法。

爲什麼你需要選擇?

代碼可以簡化嗎?爲什麼toarray()然後再concat

特別是我不知道b.ToString("x2")做了什麼。我很驚訝,甚至編譯。 https://msdn.microsoft.com/en-us/library/system.object.tostring(v=vs.110).aspx表示tostring方法不帶參數。

那麼,爲什麼我需要選擇這些東西。編碼器試圖完成什麼?

所以我們得到了一堆字節數組,然後我們必須使用computeHash來獲得一堆字節數組。然後我們重新編碼爲字符串。這是基本的想法。

那麼,爲什麼不打開文本翻譯成字節是非常快Encoding.UTF8.GetBytes(text),但我們必須這樣做奇怪的事,把這些文字到一些字符串

+0

'byte.ToString(「x2」)'產生所述字節的十六進制表示。如果您不確定表達式是什麼或涉及的類型,那麼當您將鼠標懸停在某些事物上時,Visual Studio通常很適應。是的,這可以簡化 - 'BitConverter.ToString(byte [])。Replace(「 - 」,「」)'更短,但不一定更高效(如果你想使用小寫,你需要一個額外的'ToLower' )。 –

+0

關於'.ToArray''Concat'混合 - ['String.Concat'](https://msdn.microsoft.com/en-us/library/dd991828(v = vs.110).aspx)for'IEnumerable '是在.NET4.0中添加的,因此推測這個代碼要麼比這個更舊,要麼意味着向後兼容舊的.NET版本 – UnholySheep

+0

https://msdn.microsoft.com/en-us/library/y11056e9(v= vs.110).aspx – matt

回答

1

特別是我不知道該怎麼做b.ToString(」 x2「)。我很驚訝它甚至符合

請參閱https://msdn.microsoft.com/en-us/library/y11056e9(v=vs.110).aspxhttps://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings。它將一個字節格式化爲兩個字符的小寫十六進制字符串。 0x03 =>「03」,0x0A =>「0a」。

爲什麼您需要選擇?

Select將一個enumerable轉換爲另一個enumerable。由於哈希是byte[]它是IEnumerable<byte>,所以這將每個byte轉化爲來自表達式評估的值。因此每個字節變成兩個字符的十六進制字符串

爲什麼要toarray()然後再concat?

String.Concat(string[])在.NET Framework 1.0/1.1中添加。在.NET Framework 4.0中添加了String.Concat(IEnumerable<string>)。如果這個代碼是針對.NET 3.5編寫的,那麼它就是「最優」的(沒有通過更高效的StringBuilder方法寫入)。

什麼是編碼器試圖完成。

你運行了嗎?它產生一個十六進制字符串,表示密鑰下數據的HMAC-SHA-2-512。

我很驚訝它甚至符合

它僅使用語法從C#3.0(它使用最新的是lambda expressions。C#3.0變成10歲的下一個月。(它被髮布了。 NET Framework 3.5中)

可以將代碼簡化?

肯定。

public static string CalculateSignature(string text, string secretKey) 
{ 
    using (var hmacsha512 = new HMACSHA512(Encoding.UTF8.GetBytes(secretKey))) 
    { 
     byte[] hmac = hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(text)); 
     StringBuilder builder = new StringBuilder(hmac.Length * 2); 

     foreach (byte b in hmac) 
     { 
      builder.Append(b.ToString("x2")); 
     } 

     return builder.ToString(); 
    } 
} 

那麼,這是更高性能。也許這不是「更簡單」,取決於你的定義。

+0

在vb.net tostring不接受字符串參數。所以我想知道爲什麼我可以做tostring(「x2」) –

+0

@ J.Chang:'Byte.ToString(String)'是一種適用於任何.NET語言的BCL方法。我不是一個普通的VB.NET程序員,但我的Visual Studio顯示了這種超載。 (我知道「隱藏高級會員」有一個可疑的功能,但我不認爲「ToString(String)」被視爲一個,隱藏它並不意味着它不可用。) –

+0

好吧,它不是他們的網絡。 –

相關問題