回答
的主要區別是概念性:而散列是用來保證數據的完整性,一個MAC保證完整性和認證。
這意味着哈希碼是在沒有任何外部輸入的情況下從消息中盲目生成的:您獲得的東西可用於檢查消息在其傳輸期間是否有任何更改。
MAC代替使用私鑰作爲它生成代碼時使用的哈希函數的種子:這應該保證接收者不僅消息沒有被修改,而且發送它的人是我們的期望:否則攻擊者無法知道用於生成代碼的私鑰。
根據維基百科您有:
雖然MAC函數類似於加密散列函數,它們具有不同的安全要求。要被認爲是安全的,MAC功能必須在選擇明文攻擊下抵制存在僞造。這意味着即使攻擊者能夠訪問擁有密鑰併爲攻擊者選擇的消息生成MAC的攻擊者,攻擊者也無法通過執行其他消息來猜測MAC,而無法執行不可行的計算量。
當然,儘管它們有相似之處,但它們的實現方式卻不同:通常,MAC生成算法基於哈希碼生成算法,其擴展名關注使用私鑰。
哈希是一個從消息中產生摘要的函數。密碼安全散列對於其在計算上不可行以生成具有給定摘要的消息。就其本身而言,消息的散列不提供關於給定消息的發送者的信息。如果您可以安全地傳遞消息的散列,則可以使用它來驗證是否通過不安全的傳輸正確接收了大消息。
消息認證碼是一種將共享密鑰與消息組合起來的方式,以便消息的接收者可以認證消息的發送者具有共享密鑰,並且沒有人知道密鑰可能已經發送或改變了該消息。
HMAC是基於散列的消息認證碼。通常這涉及將散列函數一次或多次應用於共享祕密和消息的某種組合。 HMAC通常是指RFC 2104或FIPS-198中記錄的算法。
MAC不加密消息,因此消息是純文本格式。它不會泄露祕密密鑰,因此MAC可以在開放信道上發送而不會泄露密鑰。
- 散列函數利用非對稱密碼術,而MAC使用對稱密碼術。
- 加密哈希函數並不總是一個MAC,但MAC可以是加密哈希函數(加密哈希函數)。
- 散列函數提供非否認,其中MAC都沒有提供非重新
(1)哈希函數不一定使用關鍵字,更不用說對稱或不對稱關鍵字。 (3)不完整並且回到前面。 -1 – EJP 2014-01-26 01:32:50
基本上主要的區別是MAC使用一個私有密鑰和散列不使用任何密鑰。因爲MAC允許我們實現身份驗證。
HASH功能:將任意長度的消息映射爲固定長度散列值(用作認證者)的函數。
MAC:消息和產生固定長度值的密鑰的函數,該固定長度值用作驗證器。
在「散列函數」定義中使用「authenticator」這個詞是誤導性的。 SHA(安全散列算法)本身並不用於真實性。它用於檢查數據的完整性。 – 2015-04-05 18:38:32
發現此問題來自其他論壇的答案。
完整性:收件人可以確信該消息尚未
這些類型的加密基元可以通過他們履行(在「追加到消息」的簡單協議)的安全目標進行區分被意外修改?
身份驗證:收件人可以確信郵件來自發件人嗎?
不可否認性:如果收件人將郵件和證明傳遞給第三方,第三方是否可以確信郵件來自發件人? (請注意,我在加密意義上講的是不可否認性,而不是法律意義上的。)此問題也很重要:
鍵:原語是否需要共享密鑰或公共 - 私有密鑰對?我認爲簡短的回答最好用一張表來解釋:
Cryptographic primitive | Hash | MAC | Digital
Security Goal | | | signature
------------------------+------+-----------+-------------
Integrity | Yes | Yes | Yes
Authentication | No | Yes | Yes
Non-repudiation | No | No | Yes
------------------------+------+-----------+-------------
Kind of keys | none | symmetric | asymmetric
| | keys | keys
請記住,對所用密鑰沒有信心的認證是無用的。對於數字簽名,收件人必須確信驗證密鑰實際上屬於發件人。對於MAC,收件人必須確信共享對稱密鑰只與發件人共享。
其他一些人現在已經改變了這些定義:散列函數不提供完整性,而認證是我們現在所說的完整性(參見https://crypto.stanford.edu/~dabo/cryptobook/)。這個改變是爲了最好的imo – 2016-07-30 23:35:10
一個散列摘要或消息的指紋,並提供既沒有完整性,也沒有認證本身,是很容易受到中間人攻擊。假設A想要將消息M與M的哈希H相結合發送給B.取而代之的是C捕獲該消息並生成M2的消息M2和哈希H2,並將其發送給B.現在B不意味着可以驗證這個是A的原始消息還是不是。但是,哈希可以用於其他一些方式來實現完整性和身份驗證,例如MAC。
MAC也是消息的摘要提供了完整性和認證。 MAC可以用許多方式來計算。最簡單的方法是使用具有兩個輸入的散列函數,即消息和共享密鑰。使用共享密鑰將身份驗證功能添加到MAC,從而提供完整性和身份驗證。然而,MAC仍然不提供不可否認性,因爲具有共享密鑰的任何一方都可以產生消息和MAC。 這裏是數字簽名和公鑰密碼體制的實際應用。
消息和MAC在消息傳遞時被共享,但是如何共享共享密鑰來重新生成MAC?如果密鑰通過消息共享,那麼中間人不能使用密鑰和MAC生成器來獲取消息更改並傳遞給接收方? – Bsienn 2017-09-20 12:35:25
@Bsienn,共享密鑰是使用公鑰加密生成的,並且不是由用戶直接共享(通過純文本消息傳遞)。 – 2017-12-14 19:15:43
- 1. 一致哈希和錐哈希之間的區別是什麼?
- 2. 哈希映射,哈希集合,哈希字典之間有什麼區別?
- 3. 字典和哈希表之間的真正區別是什麼?
- 4. Magento驗證類驗證號與驗證號之間有什麼區別
- 5. 就Spring驗證而言,錯誤代碼和消息代碼之間的區別?
- 6. Perl中的哈希和哈希引用有什麼區別?
- 7. 是否可以驗證密碼哈希與另一個密碼哈希?
- 8. 與哈希ASP.NET MVC密碼驗證
- 9. 哈希映射和併發哈希映射有什麼區別?
- 10. SQLSever身份驗證與Windows身份驗證之間的區別
- 11. 哈希驗證
- 12. X.509證書和WTLS證書之間的區別是什麼
- 13. 時間敏感的消息驗證哈希 - 獲取寬鬆的時間值
- 14. 管道和消息隊列之間有什麼區別?
- 15. $(())和expr之間的區別是什麼?
- 16. $和$ .fn之間的區別是什麼?
- 17. ++和:haskell之間的區別是什麼?
- 18. TVF/UDF之間的區別是什麼
- 19. $(「」)和$ .find(「」)之間的區別是什麼?
- 20. 「\」和「\。」之間的區別是什麼?
- 21. 「$ | ++」和「$ | = 1」之間的區別是什麼
- 22. [EmailPasswordAuthProvider,EmailAuthProvider]之間的區別是什麼
- 23. $(...)和`...`之間的區別是什麼
- 24. .equals()和==之間的區別是什麼?
- 25. System.Linq.Enumerable.WhereListIterator&System.Linq.Enumerable.WhereSelectListIterator之間的區別是什麼?
- 26. [undefined]和[,]之間的區別是什麼?
- 27. DesiredCapabilities與RequiredCapabilities之間有什麼區別?
- 28. Console.WriteLine()與Debug.WriteLine()之間有什麼區別?
- 29. gets.chomp()與STDIN.gets.chomp()之間有什麼區別?
- 30. TLS MAC消息驗證
我很抱歉,即使攻擊者可以訪問擁有密鑰併爲攻擊者選擇的消息生成MAC的攻擊者,攻擊者也無法猜測MAC是否存在其他消息,這是什麼意思? '?如果攻擊者訪問擁有密鑰的oracle,他也可以爲其他消息生成MAC,將它們作爲輸入發送給oracle,不是嗎? – tonix 2015-09-15 07:52:05
@tonix該句子僅用於定義安全的MAC功能。這種假設的情況是更現實的情況中的最壞情況,攻擊者可以觀察多個明文-MAC對,然後嘗試僞造/猜測攻擊者想發送的消息的MAC。 – ZillGate 2016-06-17 01:20:58
其他一些人現在已經改變了這些定義:散列函數不提供完整性,而認證是我們現在所說的完整性(參見crypto.stanford.edu/~dabo/cryptobook)。這個改變是爲了最好的imo – 2016-07-30 23:38:02