[英]SHA256 hash calculation
對於我的雇主,我必須為他們下載的某些文件的網絡應用程序客戶提供校驗和。
我想向用戶提供他們的客戶端工具也可能生成的哈希值,因此我一直在比較在線哈希工具。 我的問題是關於它們的散列形式,因為它們不同,奇怪的是。
經過快速搜索,我測試了5:
輸入值'test'(后面沒有'enter')所有5給我相同的SHA256結果。 然而,這里開始有一個特殊的東西,當我輸入值'test [enter] test'(所以兩行)在線工具1,2和3給我相同的SHA256哈希,而站點4和5給我一個不同的(所以1,2和3相等,4和5相等)。 這很可能與工具或底層代碼處理\\ r \\ n的方式有關,或者至少我認為如此。
巧合的是,站點1,2和3為我提供了與我的C#代碼相同的哈希:
var sha256Now = ComputeHash(Encoding.UTF8.GetBytes("test\r\ntest"), new SHA256CryptoServiceProvider());
private static string ComputeHash(byte[] inputBytes, HashAlgorithm algorithm)
{
var hashedBytes = algorithm.ComputeHash(inputBytes);
return BitConverter.ToString(hashedBytes);
}
問題是:哪些網站“正確”?
有沒有辦法知道散列是否符合標准?
UPDATE1:將編碼更改為UTF8。 這對正在創建的輸出哈希沒有影響。 謝謝@Hans。 (因為我的Encoding.Default可能是Encoding.UTF8)
更新2:也許我應該稍微擴展一下這個問題,因為它可能沒有得到解釋,對不起。 我想我要問的更多的是可用性問題,而不是技術問題; 我應該提供具有不同行結尾的所有哈希嗎? 或者我應該堅持一個? 如果他們有不同的計算哈希的方式,客戶可能會打電話給我的公司擔心他們的文件被改變了。 這通常如何解決?
所有這些網站都返回有效值。
站點4和5使用\\n
作為換行符。
編輯
我看到你編輯了你的問題,在代碼示例中添加了Encoding.Default.GetBytes
。
這很有趣,因為你看到在計算哈希之前有一些string to byte array conversion
。 換行( \\n
或\\r\\n
)以及文本編碼都是解釋字符串以獲取不同字節值的兩種方法。
一旦你有與輸入相同的字節,所有哈希結果都是相同的。
編輯2:
如果您直接處理字節,那么只需用這些字節計算哈希值。 不要嘗試提供不同的哈希值; 哈希必須只返回一個值 。 如果您的客戶端具有與您的客戶端不同的哈希值,那么他們做錯了 。
話雖如此,我很確定它永遠不會發生,因為沒有任何方法可以誤解字節數組。
Microsoft在System.Web.Helpers名稱空間中有一個名為Crypto的類,它具有開箱即用的SHA256哈希值。
例:
var plainText = "Text";
var hashedText = System.Web.Helpers.Crypto.SHA256(plainText);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.