Hash
當散列公開時證明你有數據
我正在設計一個線上服務,使用者可以上傳文件(3d 模型)進行處理。當許多不同的使用者上傳相同的文件時,我想通過允許他們在發送文件之前發布文件的雜湊(SHA256)來加快速度。如果散列存在,他們會立即獲得處理過的文件,否則他們會上傳文件。
我擔心這種方法,使用者可以在某個地方找到文件的 SHA256,他可能能夠在不實際擁有該文件的情況下下載處理過的文件。例如,SHA256 在某個地方是公開的,但文件是私有的(例如,市場公開了付費 3d 模型的 SHA256,有人為它們付費並使用我的服務對其進行處理)……或者元數據被黑客入侵
問題是:
- 這是真正的擔憂嗎?我是否應該擔心人們獲取 SHA256 並濫用它來獲取其他使用者的文件?
- 我該如何對抗?我正在考慮使用 HMAC:伺服器會向使用者發送一個密鑰並要求他為文件生成 HMAC 並將其發送回?
- 公開 HMAC 密鑰是否安全,所以我不會為每個上傳請求儲存它,但使用者可以根據這個公鑰生成 HMAC?
- 這確實是一個真正的擔憂。
- 這要怎麼打?
好吧,一旦客戶端提供了文件的 SHA256 雜湊(以快速索引伺服器上的文件),您的伺服器然後提供一個隨機的一次性密鑰並要求客戶端使用 HMAC 和密鑰再次對文件進行雜湊處理。由於密鑰是一次性且隨機的,因此攻擊者幾乎沒有機會猜測密鑰並偽造他們只知道其雜湊的文件的 MAC 標籤。
- 公開 HMAC 密鑰並不安全,因為它等同於使用自定義初始化向量進行正常散列。
==一些旁注==
現在的瀏覽器都有 WebCrypto API,它提供散列和 HMAC 的功能,但在網頁中使用它們需要安全的 HTTPS 連接。此外,這些 API 不適用於
File
/Blob
s,它們適用於ArrayBuffer
s,對於大文件來說,這可能是記憶體密集型的。