雖然AK還不爲大家所熟知,但我敢百分百肯定,未來的幾年裏,AK在互聯網業界的知名度絕對不會比AK47差,甚至會更強,會達到“無人不知,無人不曉”的程度。任何使用雲計算的企業和個人,都必須首先經過AK的洗禮!
什麼是AK
記得第一次和別人分享AK的時候,對方都先是一愣,然後調侃我怎麼一個搞互聯網的去搞軍工了!這不是一個段子,也許你們腦海中想到的AK還是1974年11月7日在閱兵式上首次露面的這個傢伙。但是今天我們的故事和它沒有半毛錢關係。
AK47
雖然AK還不爲大家所熟知,但我敢百分百肯定,未來的幾年裏,AK在互聯網業界的知名度絕對不會比AK47差,甚至會更強,會達到“無人不知,無人不曉”的程度。任何使用雲計算的企業和個人,都必須首先經過AK的洗禮!
那麼AK是什麼?它又有什麼本事能做到人盡皆知呢?
雲計算歸根結底的產物就是API,也把它叫做API經濟。即:雲計算裏面的API是產品,是能夠爲雲計算提供商帶來經濟利益的。說白了,就是調用API需要花錢。這個邏輯就和用水用電需要交錢一個道理。用水的時候有水錶,根據水錶的編號能找到戶主的身份。用電的時候有電錶,根據電錶的編號能找戶主的身份。使用雲計算API的時候,要根據什麼來找到使用者的身份的呢?答案是AK。
AK的英文全稱是Access Key,翻譯成中文是訪問密鑰。它屬於雲計算中身份認證領域的範疇。用戶在使用雲計算API的時候出示AK,這樣雲服務提供商就能夠根據AK來確定使用者的身份,進而向其收費了。
關於AK的定義,AWS在其文檔Understanding and Getting Your Security Credentials中有詳細的闡述:
Access Key包含兩部分:access key id (例如AKIAIOSFODNN7EXAMPLE)和access key secret (例如wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY)。當訪問AWS API的時候,可以使用Access Key對API請求進行簽名。像用戶名和密碼一樣,在簽名的過程中,必須同時使用access key id 和access key secret。從安全的角度,你需要下你個對待用戶名密碼一樣對待你的Access Key。
使用AK簽名流程
正如上面的文檔所述,當訪問雲計算API的時候,可以使用AK對API請求進行簽名。簽名就是給一個API請求添加認證的過程,可以簡單的理解爲給API請求“蓋章”。有了簽名的加持,雲服務提供廠商就可以識別API調用是誰發起的了。使用AK進行簽名的流程如下入所示。
AWS簽名過程(來源AWS官網文檔)
AWS V2簽名過程細節
本文以AWS第二版簽名爲例,講解下AK簽名的流程。假設某用戶持有AK的信息如下:
<AKIAIOSFODNN7EXAMPLE, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY>
要發起一個API請求,訪問AWS中elasticmapreduce這款雲產品的DescribeJobFlows接口,基礎的請求信息如下:
https://elasticmapreduce.amazonaws.com?
Action=DescribeJobFlows
&Version=2009-03-31
AWS在收到這個請求以後,並不知道請求者是誰,也不知道該向誰收費了。爲此,AWS要求用戶在請求中添加如下參數:
- AWSAccessKeyId:AK中的access key id
- SignatureMethod:本次請求的簽名方法
- SignatureVersion:本次請求的簽名版本
- Timestamp:發起本次請求的時間戳
- Signature:簽名的值
在上面的參數中,前四個參數都是可以直接獲取或者設定的,最後一個參數需要請求者自己計算。在添加簽名之前的請求如下:
https://elasticmapreduce.amazonaws.com?
Action=DescribeJobFlows
&Version=2009-03-31
&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
&SignatureVersion=2
&SignatureMethod=HmacSHA256
&Timestamp=2011-10-03T15:19:30
在一切準備就緒之後,就可以按照AWS文檔Signature Version 2 Signing Process規定的方式計算簽名了。首先標準化待簽名的字符串如下:
GET
elasticmapreduce.amazonaws.com
/
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31
接着使用SignatureMethod指定的算法和用戶持有的access key secret進行簽名,結果如下
i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf/Mj6vPxyYIs=
上面的簽名值經過URL編碼之後就可以添加到請求中了,最終用戶向AWS發送的請求如下:
https://elasticmapreduce.amazonaws.com?
Action=DescribeJobFlows
&Version=2009-03-31
&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
&SignatureVersion=2
&SignatureMethod=HmacSHA256
&Timestamp=2011-10-03T15:19:30
&Signature=i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D
使用AK的意義
雖然在上文中頻繁提到,使用AK是爲了雲服務提供上能夠知道該向誰收費。但這僅僅是AK衆多意義中的一丟丟。AWS在其文檔Signing AWS API Requests 中做了詳細描述。使用AK對API請求進行簽名有如下三個意義:
1. 幫助雲服務提供商驗證API請求者的身份。
簽名能夠保證請求的發起者持有合法的access key secret
2. 防止數據在網絡傳輸的過程中被篡改
將請求參數作爲一部分來計算hash簽名,並將簽名作爲API請求的一部分。AWS可以在收到請求時驗證簽名的合法性,以保證傳輸的數據沒有被篡改。(一旦被篡改,簽名就不對了)
3. 防止重放攻擊
請求的參數中添加了時間戳信息,一旦超過一定的時間限制,請求將不再可用。這就降低了中間人截獲API請求並進行重方的風險。
本文以AWS爲例,講解了在雲計算場景中AK的基本概念、AK的使用方法、以及AK的意義和價值。正如開篇所講,雖然AK還不爲大家所熟知,但隨着越來越多的人使用雲計算,AK必將成爲他們走上雲計算的第一課。未來的幾年裏,AK在互聯網業界的知名度會越來越高。當然,我們也要提前意識到,任何事情都有利有弊。AK的普及也必將帶來一些新的值得關注的安全問題。本文就不一一贅述了。
覺得本文好的話,就來關注我吧!@E-臻。