摘要:通常我們將此過程稱為簽署請求并且我們將輸出算法稱為簽名,因為它會模擬真實簽名的安全屬性。查詢字符串請求身份驗證方法與普通的方法稍有差異,不同之處僅在于請求參數(shù)和元素的格式。請注意,在中,位置元素已替換為。
US3 REST API 基于 HMAC(哈希消息身份驗證碼)密鑰使用自定義 HTTP 方案進行身份驗證。要對請求進行身份驗證,您首先需要合并請求的選定元素以形成一個字符串。然后,您可以使用 UCloud 私有訪問密鑰來計算該字符串的 HMAC。通常我們將此過程稱為“簽署請求”并且我們將輸出 HMAC 算法稱為“簽名”,因為它會模擬真實簽名的安全屬性。最后,您可以使用本部分中介紹的語法,作為請求的參數(shù)添加此簽名。
系統(tǒng)收到經(jīng)身份驗證的請求時,將提取您申領(lǐng)的 UCloud 私有訪問密鑰,并以相同的使用方式將它用于計算已收到的消息的簽名。然后,它會將計算出的簽名與請求者提供的簽名進行對比。如果兩個簽名相匹配,則系統(tǒng)認為請求者必須擁有對 UCloud 私有訪問密鑰的訪問權(quán)限,因此充當向其頒發(fā)密鑰的委托人的頒發(fā)機構(gòu)。如果兩個簽名不匹配,那么請求將被丟棄,同時系統(tǒng)將返回錯誤消息。
基于以上的原理,我們對空間管理和文件管理兩套接口提供兩種原理一樣但是細節(jié)不同的鑒權(quán)過程。
賬戶的公私鑰可以在 UCloud 控制臺中 API 產(chǎn)品 - API 密鑰,點擊顯示 API 密鑰獲取。
空間管理的簽名使用查詢字符串的簽名方式,客戶端通過把簽名字段作為一個 query 字段傳遞給服務(wù)端請求授權(quán)驗證。攜帶了簽名(Signature)的創(chuàng)建空間請求具有如下的格式:
GET /Type=public&BucketName=demobucket&PublicKey=uclouddemo@mail.com45207436768156091&Action=CreateBucket&Signature=13f7989d4a5a8ued83c0e57ah43b3607bc506c7c HTTP/1.1
其中 Signature 的偽代碼計算方式如下:
//生成請求的 query 字典
querys = {"PublicKey" : publicKey} + {其他 query 字段}
//對 query 字典按照字典排序方式(lexicographical order)排序
querys = querys.sort()
//生成 signstring
signstring = ""
for key, value in querys {
signstring += key + value
}
//將私鑰加入簽名
signstring += privateKey
//按照SHA1(RFC 3174)計算簽名
signature = sha1(signstring)
//以16進制顯示簽名
signature = HEX(signature)
其他空間管理 API 的簽名均可使用同樣的計算方式生成。
文件管理的簽名有兩種不同的方式通過 HTTP 請求傳遞給服務(wù)器,分別是身份驗證標頭和查詢字符串請求身份驗證替代項。
身份驗證標頭該方式使用 Authorization 頭部字段傳遞簽名數(shù)據(jù),并放置于各 HTTP 請求的報文頭中,如下圖所示,身份驗證標頭具有以下形式:
Authorization: UCloud UCloudPublicKey:Signature
其中,Signature 是一個哈希值,具體為請求中特定元素的 HMAC-SHA1(RFC2104),因此 Signature 會因請求不同而異。如果客戶端請求中隨附的 Signature 與服務(wù)端計算出的 Signature 相匹配,則證明請求者擁有 UCloud 允許的訪問權(quán)限。以下是 Authorization 身份驗證標頭構(gòu)造的偽代碼:
Authorization = "UCloud" + " " + UCloudPublicKey + ":" + Signature
Signature = Base64( HMAC-SHA1( UCloudPrivateKey, UTF-8-Encoding-Of( StringToSign ) ) )
StringToSign = HTTP-Verb + "
" +
Content-MD5 + "
" +
Content-Type + "
" +
Date + "
" +
CanonicalizedUCloudHeaders +
CanonicalizedResource
CanonicalizedUCloudHeaders = <described below>
CanonicalizedResource = "/" + Bucket + "/" + Key
StringToSign 中包括兩類標頭元素:
一類是位置標頭,僅有 3 個,分別是 Content-MD5、Content-Type 和 Date,在 StringToSign 中不包括這些標頭的名稱,僅包括它們在請求中的值,如果請求中這些標頭不存在,需要用空字符串("")
代替;另一類是 UCloud 附加標頭,以X-UCloud-
開頭,此類標頭需要按照下面指定的方法構(gòu)造 CanonicalizedUCloudHeaders 字符串后加入到 StringToSign 中。
備注:
如果位置標頭不在請求中(例如,Content-Type 或 Content-MD5 對于 PUT 請求是可選的,并且對于GET請求沒有任何意義),必須使用空字符串""替換該位置;BASE64 使用 standardbase64,不是 URLSafe 的 base64 算法,下同;當使用 POST 表單上傳時,簽名使用的 Content-Type 字段應(yīng)該是 form 參數(shù)中的 Content-Type 字段(即文件本身的 mimetype),而非 HTTP 請求的 Content-Type。UCloudPublicKey 和 UCloudPrivateKey 對應(yīng) 令牌管理 中創(chuàng)建的令牌,用戶也可以用 UCloud 私有訪問密鑰進行訪問。Key使用原始字符串即可,無需經(jīng)過url編碼計算CanonicalizedUCloudHeaders步驟
將每個以X-UCloud-
開頭的 HTTP 標頭名稱轉(zhuǎn)換為小寫。例如X-UCloud-Date”改為“x-ucloud-date
。
根據(jù)標頭名稱按字典順序排列標頭集。
按照 RFC2616 中第 4.2 節(jié)中的規(guī)定,將相同名稱的標頭字段合并為一個header-name:comma-separated-value-list
對,各值之間不留空格。
例如,可以將元數(shù)據(jù)標頭x-ucloud-meta-username:fred
和x-ucloud-meta-username:barney
合并為單個標頭x-ucloud-meta-username:fred,barney
。
通過將折疊空格(包括換行符)替換為單個空格,“展開”跨多個行的長標頭(按照 RFC2616 中第 4.2 節(jié)允許的方式)。
刪除標頭中冒號周圍的空格。例如,標頭x-ucloud-meta-username:fred,barney
改為x-ucloud-meta-username:fred,barney
。
最后,請向生成的列表中的每個標準化標頭附加換行字符(U+000A)。通過將此列表中所有的標頭規(guī)范化為單個字符串,構(gòu)建 CanonicalizedUcloudHeaders 元素。
示例
確定使用 API 接口,例如使用 PUTFile 接口,簽名前的請求如下
PUT /demokey HTTP/1.1 Host: demobucket.ufile.ucloud.cn Content-Length: 11434 Content-Type: image/jpeg X-UCloud-Foo: foo X-UCloud-Bar: bar1 X-UCloud-Bar: bar2
拼接簽名字符串對照 step1 的請求中的各個參數(shù),程序中的各變量取值如下(采用偽代碼描述)
bucket = "demobucket"
key = "demokey"
http_verb = "PUT"
content_md5 = ""
content_type = "image/jpeg"
date = ""
canonicalized_ucloud_headers = "x-ucloud-foo:foo" + "
" + "x-ucloud-bar:bar1,bar2" +
"
canonicalized_resource = "/" + "demobucket" + "/" + "demokey"
string2sign = "PUT" + "
"
+ "" + "
"
+ "image/jpg" + "
"
+ "" + "
"
+ "x-ucloud-foo:foo" + "
" + "x-ucloud-bar:bar1,bar2" + "
"
+ "/demobucket/demokey"
即
string2sign = "PUT
image/jpeg
x-ucloud-foo:foo
x-ucloud-bar:bar1,bar2
/demobucket/demokey"
hmac-sha1 運算使用 UCloud 分配給您的私鑰對簽名字符串做 hmac-sha1 運算
hmacstring = hmac-sha1(privateKey, string2sign)
base64 運算對生成的 hmacstring 做 base64 運算
base64string = base64(hmacstring) = S5FVD2w613MKb/hisjaqHdjvn9U=
生成最終簽名格式
signature = UCloud [email protected]:S5FVD2w613MKb/hisjaqHdjvn9U=
生成帶簽名的 HTTP 請求
PUT /demokey HTTP/1.1 Host: demobucket.ufile.ucloud.cn Content-Length: 11434 Content-Type: image/jpeg X-UCloud-Foo: foo X-UCloud-Bar: bar1 X-UCloud-Bar: bar2 Authorization: UCloud [email protected]:S5FVD2w613MKb/hisjaqHdjvn9U=
查詢字符串請求身份驗證替代項可以通過傳遞請求信息作為查詢字符串參數(shù),而不是使用 AuthorizationHTTP 標頭來驗證特定類型的請求。這在允許第三方瀏覽器直接訪問您的 US3 私有空間的文件,而無需代理請求時非常有用。其概念是構(gòu)建一個“預(yù)簽名”的請求并將其編碼為最終用戶瀏覽器可檢索的 URL。此外,您還可以通過指定過期時間來限制預(yù)簽名請求。
以下是查詢字符串經(jīng)身份驗證的 US3 REST 請求示例。
GET /demokey.jpg?UCloudPublicKey=AKIAIOSFODNN7EXAMPLE&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1
Host: demobucket.s3.ucloud.cn
Date: Mon, 26 Mar 2007 19:37:58 +0000
查詢字符串請求身份驗證方法與普通的方法稍有差異,不同之處僅在于 Signature 請求參數(shù)和 StringToSign 元素的格式。下面的偽語法演示了查詢字符串請求身份驗證方法。
Signature = URL-Encode( Base64( HMAC-SHA1( UCloudPrivateKey, UTF-8-Encoding-Of( StringToSign ) ) ) );
StringToSign = HTTP-VERB + "
" +
"
" +
"
" +
Expires + "
" +
CanonicalizedUCloudHeaders +
CanonicalizedResource;
請注意,在 StringToSign 中,HTTPDate 位置元素已替換為 Expires。CanonicalizedUCloudHeaders 和 CanonicalizedResource 是相同的。
文件 ETag 可用于查詢文件是否可以進行秒傳。
具體算法的偽代碼如下:
if filesize<=4MB:
hash = base64_url_safe(blkcnt, sha(file))
else:
hash = base64_url_safe(blkcnt, sha(sha(blk0), sha(blk1)...))
字段含義
blkcnt:文件以4MB為一個塊進行切分后的塊個數(shù), 占4個字節(jié),以小端模式保存。
blkN:第N(N>=0)個數(shù)據(jù)塊的數(shù)據(jù)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/126651.html
摘要:概覽概覽產(chǎn)品簡介產(chǎn)品概述功能概覽產(chǎn)品優(yōu)勢使用限制存儲類型地域和域名計量計費產(chǎn)品價格計費規(guī)則欠費處理計費案例快速上手開通服務(wù)開始使用控制臺指南存儲空間日志管理文件管理生命周期靜態(tài)網(wǎng)站托管域名管理鏡像回源跨區(qū)域復制跨域設(shè)置數(shù)據(jù)分析防盜鏈統(tǒng)計報 概覽產(chǎn)品簡介產(chǎn)品概述功能概覽產(chǎn)品優(yōu)勢使用限制存儲類型地域和域名計量計費產(chǎn)品價格計費規(guī)則欠費處理計費案例快速上手開通 US3 服務(wù)開始使用 US3控制臺指南...
摘要:示例移動到可執(zhí)行目錄下配置信息內(nèi)同,配置路徑自定義。卷的序列號是的目錄個文件字節(jié)個目錄可用字節(jié)進行掛載操作這里掛載到盤,并且指定為的用戶,日志級別為,預(yù)讀窗口為,掛載的桶名為注意目前下掛載只能前臺掛載 下載與環(huán)境準備本篇目錄運行環(huán)境下載鏈接配置賬號訪問信息運行環(huán)境US3FS基于Linux下fuse和Windows平臺下winfsp實現(xiàn),您的機器需要支持fuse或winfsp。建議您將US3F...
想自建網(wǎng)盤但是又苦于數(shù)據(jù)太大,購買大存儲容量的VPS主機價格太貴?不妨試試ZPan自建網(wǎng)盤存儲。ZPan致力于打造一款不限速的網(wǎng)盤系統(tǒng),因此采用客戶端直連云存儲的方式進行設(shè)計,即它不支持本地存儲,你的所有數(shù)據(jù)都是存在第三方存儲商那里。目前ZPan支持所有兼容S3協(xié)議的云存儲平臺,包括阿里云OSS 、騰訊云COS 、七牛云Kodo 、Ucloud US3(暫不支持自動設(shè)置CORS) 、華為云OBS ...
摘要:歸檔存儲空間英文名稱,是歸檔文件的組織單位,相當于目錄的作用,也是計費權(quán)限控制等功能的管理單位。歸檔文件英文名稱,是數(shù)據(jù)操作的基本單元,支持任意數(shù)據(jù)類型。主要概念注:UArchive 產(chǎn)品已作為歸檔存儲類型合并至 US3 對象存儲,目前不再向新用戶提供獨立的歸檔存儲服務(wù)。如需使用更低成本的對象存儲服務(wù),請至 US3 對象存儲控制臺 。更多 US3 歸檔存儲類型的使用說明請參考 數(shù)據(jù)歸檔方案。...
摘要:文件管理控制臺文件管理大于工具分片上傳工具使用之前請配置內(nèi)外網(wǎng)不同地區(qū)域名不同,詳情參考文檔上傳工具可以配置相關(guān)客戶端密鑰填寫公私鑰注固定域名不加后綴目前僅中國北京二,中國香港,越南胡志明,韓國首爾,巴西圣US3文件管理1、控制臺文件管理(大于500M 工具分片上傳) 2、filemgr工具https://docs.ucloud.cn/ufile/tools/tools/tools_file...
摘要:三是可以降低我們的寫放大,在寫入時不會由于需要更新元數(shù)據(jù)而寫入兩次,這在隨機能力不是強項的硬盤場景下也格外重要。前言UCloud在2020年8月正式發(fā)布了基于US3的全新一代歸檔存儲產(chǎn)品,該產(chǎn)品采用UCloud全新自研存儲架構(gòu),相較標準存儲降低近80%存儲成本的同時,與市場同類歸檔存儲產(chǎn)品相比降低近30%的價格。據(jù)IDC的預(yù)測,全球年新增數(shù)據(jù)量到2025年將達175ZB,真正能存儲下來的數(shù)據(jù)...
閱讀 484·2024-11-07 18:25
閱讀 130851·2024-02-01 10:43
閱讀 961·2024-01-31 14:58
閱讀 925·2024-01-31 14:54
閱讀 83048·2024-01-29 17:11
閱讀 3313·2024-01-25 14:55
閱讀 2086·2023-06-02 13:36
閱讀 3208·2023-05-23 10:26