最近想拿一個小項目來試水RESTful Web API,項目只有幾個調用,比較簡單,但一樣須要身份驗證,若是是傳統的網站的話,那不用說,確定是用戶名+密碼在登陸頁得到登陸Token,並把登陸Token記在Cookie和Session中做爲身份標識的這種方式,但如今不一樣了,關鍵是RESTful,這意味着咱們設計出來的這些API是無狀態的(Stateless),下一次的調用請求和這一次的調用請求應該是徹底無關的,也就是說,正宗的RESTful Web API應該是每次調用都應該包含了完整的信息,沒錯,包括身份信息!數據庫
那如何確保安全?傳輸時給密碼作MD5加密?得了吧!這樣作只能讓你本身感受「安全」點,其實沒什麼任何用處,利用如今的技術(有種叫什麼Rainbow Table啥的來着?本人外行,不是很懂)很快就能算出明文密碼了,並且如何防止挾持和重發攻擊?api
也許你想到了,SSL,若是你打算採用SSL,請忘記一切自行設計的加密方案,由於SSL已經幫你作好了一切,包括防止監聽,防止挾持,防止重發……一切都幫你考慮好了,你大膽地把明文密碼寫在你的包中就OK了,我向你保證沒問題。緩存
但SSL的缺點是服務器端配置相對有點複雜,更關鍵的就是客戶端對此支持可能很差,那你考慮一種本身的加密方法,有木有?我這裏提供一種方法,思路來自於:http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/,我只是把上面的內容中整理了一下變成了個人方法。(傳說中的剽竊?呵呵)方法描述以下:安全
這是大體過程,若是數據庫裏找不到該用戶,或者解密錯誤,都被認爲驗證不經過。如下是一些改進:服務器
這種方法應該足夠安全了!網絡
密碼根本沒有在網絡上傳輸,密文采用的是非驗證的對稱加密,沒有密鑰就沒法逆轉,URL驗證避免了傳統的身份挾持攻擊(即攔截一個用戶的包並冒充此用戶來訪問其它的資源,即使沒法破解用戶密碼), 再用GUID來避免了重發攻擊,惟一須要擔憂的是用戶泄露了本身的密碼。less
元芳,你怎麼看?
網站