RESTful接口簽名認證實現機制


RESTful接口

       互聯網發展至今,催生出了很多豐富多彩的應用,極大地調動了人們對這些應用的使用熱情。但同時也為互聯網應用帶來了嚴峻的考驗。具體體現在以下幾個方面:

1.     部署方式的改變:當用戶量不多的情況下,可能只需部署一台服務器就可以解決問題,但是當很多用戶的情況下,為抗住高並發訪問,需要組成應用集群對外提供服務;

2.     應用構建的改變:很多應用采用了多種技術解決方案,不同編程語言(如C,Java,Python),所以很難采用傳統應用構建模式將不同模塊整合進來;

3.     數據開放的改變:開放是互聯網發展的必然,因為這種方式將應用本身的價值最大化了,同時用戶可以基於已有功能生成特有需求應用,提高用戶粘度,開放共贏。

而近觀傳統的Web應用,均為采用集中部署結構,基於某種特定技術開發完成,基於session或cookie等會話追蹤機制。加上需要系統間交互信息,使得實現十分復雜,且可伸縮性、易用性、維護性極差。

       基於以上矛盾,出現了一種新的互聯網應用架構風格—REST(Representational StateTransfer)。最初這種思路出現在Roy Fielding博士的論文中,他也是HTTP規范的主要作者之一。REST充分利用HTTP的優勢,以資源位核心,將資源的CRUD映射為HTTP的 GET PUT POST DELTE方法,服務端無需保存任何客戶端信息。客戶端的每次資源請求包含了服務端響應需要的所有語義信息。

       我們可以看出,基於REST風格架構的應用特點是:互聯網可以看成一個巨大的狀態機,資源相當於狀態,而URI相當於狀態的表述。客戶端通過訪問不同資源,進行狀態切換。服務端卻無須記住這些狀態,可通過橫向擴展方式消除性能瓶頸。

       但是,REST構建的應用如何進行安全控制呢?我們可不希望把自己暴露出去任人“宰割”。目前,常用的方式是OAUTH形式認證方式,這種方式適合對** 應用系統有很強依賴的時候考慮,比如新浪微博開放接口就采用這種。本文主要講解基於token機制的簽名認證模式。

具體簽名規則

       在用戶可以使用REST接口之前,首先需要通過向REST接口開放方申請,當獲准后會收到兩個key:accessKey和secretKey。其中 accessKey相當於用戶標識,應用會通過它區分不同用戶,而secreKey相當於提供給用戶的密碼,在接口使用過程中都不會在網絡中傳輸,只有用 戶和應用系統知道。

       用戶對接口的每一次請求都會默認通過某種機制生成一個簽名,然后發送給REST服務端。服務端收到后,會根據該機制驗證該請求的合法性,從而避免非法用戶的隨意使用。

       一般,簽名以如下形式保存在HTTP Header中發送給REST服務器(其中oss為固定字,Signature是摘要內容):

token = “oss” + “ ”+ accessKey + “:” + Signature

計算的偽代碼如下:

StringToSing =HTTP-Verb +”\n”+      //http請求的動作
            Content-MD5+”\n”+     //http請求的MD5值
            Content-Type+”\n”+     //http請求的類型
            Date+”\n”+            //http請求時間
            CanonicalizdResource;  //http請求資源

其中HTTP-Verb是http請求動作,對應於GET,PUT,DELETE,POST等(不能為空),Content-MD5表示請求內容數據的 MD5值(可以為空,以空字符代替,下同),Content-Type為請求的類型(可以為空),Date為本次操作的時間(不能為 空),CanonicalizdResource表示請求的資源(不能為空),當然我們還可以根據系統本身情況指定某些可選或必選參數。

Signature =BASE64(HMAC-SHA1(UTF-8-Encoding-Of(secretKey, StringToSign)))

采用utf-8提前對參數進行編碼,可以減少客戶端編碼差異帶來的影響,因為服務端到時是統一采用utf-8來做的,HMAC-SHA1生成簽名摘 要指紋信息是不可逆的,安全性得到提高,最后還進行了BASE64編碼的原因是將摘要內容全部轉換為可顯字符,應對某些不可顯字符在網絡傳輸中的丟失。

  服務端驗證方式則是根據傳輸過來的token解析出accessKey和Singature,根據accessKey得到本地保存的對應 secretKey(注意其並未在網絡中傳輸),然后再重新根據客戶端Signature生成方式重新生成與解析的進行比較,相同則認證成功結束,否則, 直接返回錯誤信息給客戶端。

  整個流程通過以下一張圖,進一步闡述:

值得注意的是,JDK提供了java.securty包,里面有各種加密算法,用來進行代碼的標識和身份認證。

術語解釋

       接下來簡要的對常用的摘要算法及加密算法進行解釋,方便具體使用過程中采取不同方式加強系統的安全性。

       常用的哈希算法(生成指紋或簽名)有MD5和SHA。MD5在文件完整性、網站登錄和數字簽名等領域有着廣泛使用,理論上說MD5數字簽名可以偽造,但說其已被破解,那只是杞人憂天罷了。SHA也是著名的哈希算法,不可逆算法,多用於數字簽名的情況。

       常用的對稱加密算法有DES和AES。DES是老牌的加密算法,這是應用最廣泛的密鑰系統,也是可逆的對稱加密算法。而AES是一種高級的加密標准,2002年成為標准,可用於替代DES,可逆對稱加密算法。

       常用的非對稱公鑰加密算法是RSA,多數網銀采用的就是RSA算法來認證的。RSA的安全性依賴於大數的因子分解,它是第一個技能用於數據加密也能用於數字簽名的算法,也是可逆算法。但是注意這種算法運算代價很高,速度比較慢,比DES之類算法要慢得多。

       對於RSA啰嗦下,公鑰和私鑰成對出現。用公鑰加密數據,用私鑰解密數據(別人傳數據給我);用私鑰加密數據作為數字簽名,用公鑰來驗證數字簽名(我傳數據給別人)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM