Azure 進階攻略 | 文件完整性,你打算如何證明?

来源:http://www.cnblogs.com/zangdalei/archive/2017/08/14/7358446.html
-Advertisement-
Play Games

我們可以通過文件校驗值的方式來解決這種問題:通過專用工具,用不同計算方法(例如 MD5)對文件計算校驗值,隨後在需要時重新計算文件校驗值,並與最初的值對比。如果因為任何原因(網路問題、磁碟故障、病毒篡改)導致文件中哪怕有一個比特的內容有了變化,都會導致校驗值產生極大不同。而校驗值不同,就意味著文件受... ...


假設你是一位獨立軟體開發者,通過自己的網站提供軟體下載。網站完全托管在 Azure 中,並且軟體下載也是通過 Azure Blob 存儲和 Azure CDN 服務提供的。

這做法真不錯,不需要自己管理伺服器,就可以快速低成本地建立網站,並且用戶數量再多也不擔心網站撐不住了。

一個風和日麗的下午,你搞定了新版軟體開發,第一時間上傳到 Blob 存儲,等著用戶們下載升級。然而很快便收到消息:下載的新版沒法解壓縮,接著越來越多用戶反饋說遇到類似問題。

後來檢查發現,最初上傳到 Blob 的過程中,因為某種莫名其妙的原因,上傳的文件本身就是損壞的……

 

So,你下載上傳的文件

「真正」就是你需要的那個文件嗎?

我們可以通過文件校驗值的方式來解決這種問題:通過專用工具,用不同計算方法(例如 MD5)對文件計算校驗值,隨後在需要時重新計算文件校驗值,並與最初的值對比。如果因為任何原因(網路問題、磁碟故障、病毒篡改)導致文件中哪怕有一個比特的內容有了變化,都會導致校驗值產生極大不同。而校驗值不同,就意味著文件受損了!

因此為了避免上面提到的悲劇,你只需要:

1、在將文件上傳到 Azure Blob 存儲(或其他任何網路位置)前,在自己電腦上使用校驗工具算出文件的校驗值,並對上傳後的文件重新計算比較校驗值,確保上傳過程沒有導致文件損壞。

2、讓用戶下載你的文件同時,在網頁上提供文件校驗值。這樣有需要的用戶就可以在下載之後進行計算和比較,確保自己下載過程沒有導致文件損壞。

很多小伙伴可能舉手問我:怎樣計算文件的校驗值呢?此類工具非常多,微軟也提供了一個免費的工具。該工具支持通過 MD5 和 SHA-1 兩種計算方法計算文件的校驗值。

那麼,對於上傳到 Azure Blob 中的文件,如何實現自動計算和對比校驗值?難道每次都要自己重新下載進行對比麽?太麻煩了啊!

 

Azure Blob

可以自動幫你計算和對比 MD5 哦!

在上傳文件或者其他二進位內容到 Azure Blob 存儲時,可以利用請求中的 MD5 值來驗證內容完整性,而上傳成功後的 Blob 屬性裡面也會包含 MD5 這個屬性,以用作後續的驗證。

首先需要註意,完整性檢查是基於當前 REST 請求的,也就是說只會對當前上傳內容進行 MD5 值的計算和對比,因為 REST API 是無狀態的。

隨後要註意,基於 MD5 的完整性檢查,工作過程是這樣的:

1.(在上傳者本地)計算當前上傳內容的 MD5 值,

2. 在當前上傳文件的 REST 請求頭部(Content-MD5)設置該 MD5 值,

3. 服務端根據當前請求里的內容計算 MD5,並對比請求頭部中的 MD5 值,

4. 相同則驗證成功,並將該 MD5 值賦予 Blob 的 MD5 屬性,否則失敗。

最後,上傳到 Azure Blob 支持兩種方式,整體上傳和分塊上傳。可以採用整體上傳方式,一個請求完成;如果內容很大,比如幾個 GB,就需要分塊上傳,這時上傳分為多個請求,每個請求只上傳部分內容,這樣可以保證更高的效率和成功率。

如果是整體上傳,實際是調用 Put Blob 請求,這時上傳的內容就是文件完整內容,因此完全符合前面描述的MD5 完整性檢查工作過程,也就是最終既會做驗證,Blob 也會有 MD5 值。

但如果分塊上傳,實際是多個 Put Block 請求加上一個 Put Block List 請求組成。每個 Put Block 請求只上傳部分內容,因此這類請求里的 MD5 只能針對當前上傳內容,不能作為最終 Blob 的 MD5 值。而 Put Block List 請求的內容是一個列表,包含前面所有上傳 Block 的標識,因此這個請求里的 MD5 值也只能是對這個列表做完整性檢查。但是所有這些請求都驗證成功時可以保證內容的完整性。所以驗證是有的,但 Blob 沒有MD5 值。

目前出於性能考慮,Azure 存儲服務不會彙總前面請求里的所有 Block 的內容來計算整個 Blob 的 MD5 值,但提供了一個特殊的請求頭部 x-ms-blob-content-md5,服務端會將該頭部屬性值設置為 Blob 的 MD5 值。因此客戶端只要在最終的 Put Block List 請求里設置了整個內容的 MD5 值到 x-ms-blob-content-md5,就可以保證驗證,並且 Blob 也有 MD5 值。

因此分塊上傳基於 MD5 的完整性檢查的工作過程是:

1、將上傳文件分成多塊

2、將每一塊以 Put Block 請求發送,並計算當前塊的 MD5 值設置到 Content-MD5 頭部

3、當所有塊都發送完成後,發送 Put Block List 請求

  1. 計算整個上傳文件的 MD 值並設置到 x-ms-blob-content-md5 頭部

  2. 將前面發送的塊的標識組成列表作為請求的內容

  3.  計算塊標識列表的 MD5 值設置到 Content-MD5 頭部

4、對於所有請求,服務端根據當前請求里的內容計算 MD5,並對比請求頭部中的 Content-MD5 值,相同則驗證成功

5、然後將 Put Block List 請求里的 x-ms-blob-content-md5 的值賦予 Blob 的 MD5 屬性

總結來說,有兩個問題需要註意:

 

1/如何判斷是否做完整性驗證?

取決於請求的頭部 Content-MD5,有則驗證,否則無驗證。註意:

1.Put Blob 請求裡面 Content-MD5 和 x-ms-blob-content-md5 效果一樣。

2. 分塊上傳發送 Put Block List 請求時,如果把整個文件內容的 MD5 值設置給了 Content-MD5,那麼會驗證報錯。因為 Content-MD5 只用於當前請求內容的驗證。

2/如何判斷 Blob 是否包含 MD5 值?

整體上傳時,如果當前請求的 x-ms-version 大於等於 2012-02-12,那麼即使客戶端沒有設置 MD5 值,服務端也會自行計算並賦予 BlobMD5 屬性。

分塊上傳時,就取決於 x-ms-blob-content-md5 是否有值。

立即訪問http://market.azure.cn


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Azure 媒體服務從 6 月開始已支持 AAD 身份驗證。REST API 和. NET 客戶端庫的客戶現在可以使用 AAD 身份驗證來對請求授權。此外,Azure 門戶中也已發佈新的管理選項卡,藉此可簡化通過 AAD 進行用戶和服務主體認證的過程。 ...
  • Azure 7月新發佈:Cosmos DB,事件中心捕捉功能,Hybrid Connections,流量管理器快速故障轉移功能。 ...
  • 本文介紹了通過複製和導出兩個操作,將 Azure SQL 資料庫中的內容轉移至其他位置(例如本地環境)的具體做法。藉此可以幫助用戶在 Azure 中運行資料庫的同時,在本地或指定的其他位置額外保留一個副本,滿足制度或業務等各方面的要求。 ...
  • YUM 有點類似於.net中的nuget。 YUM倉庫 實踐: 查看系統安裝時預設集成的yum倉庫。 YUM基本命令 實踐:使用yum命令安裝tigervnc.x86_64 YUM查詢 實踐:查詢所有包含'vnc'的rpm包。 創建YUM倉庫 創建YUM倉庫暫時只作為瞭解,後面再深入。 ...
  • Azure 基礎設施具備很高安全性,其運營管理模式和威脅防禦的經驗可以保護 Azure 的基礎設施、雲架構、管理程式、伺服器以及租戶的使用環境。但是保護基礎設施的安全僅僅是雲安全的一部分,對於雲應用的高級威脅防禦解決方案,還應該包含工作負載分擔的能力以及不論是從攻擊方式、惡意軟體還是其他複雜攻擊企業... ...
  • 就算有冗餘機制,也不能掉以輕心。最佳應對辦法,不是給冗餘機制再搞一套冗餘機制,有妥善的維護就夠了。 ...
  • Azure 6 月新發佈:磁碟加密預覽版 , CDN 用戶上傳 HTTPS 自有證書及價格調整。 ...
  • CDN 的全稱是 Content Delivery Network,即內容傳送網路。其目的是通過在現有的 Internet 中增加一層新的網路架構,將網站的內容發佈到最接近用戶的網路“邊緣”,使用戶可以就近取得所需的內容(音樂、圖片、影片、應用程式和文檔等),提高用戶訪問網站的響應速度。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...