閱讀41 返回首頁    go 阿裏雲 go 技術社區[雲棲]


網絡安全那點事

網絡安全水很深,零碎的也看了不少資料,但是總覺得很飄渺,可能是平時主要是做應用開發,而真正實踐密碼設計(cryptography)和安全設計(security)的機會比較少.

剛剛看了幾篇文章 listed as following,有一些A-Ha moment,也能把我現有的關於web安全的知識竄起來,故記錄在此:

https://gdp.globus.org/gt4-tutorial/multiplehtml/ch09s02.html

https://gdp.globus.org/gt4-tutorial/multiplehtml/ch09s03.html

https://gdp.globus.org/gt4-tutorial/multiplehtml/ch09s04.html


一,怎樣保證通信安全?

這是個古老的問題,而且古人的經驗告訴我們,暗號能夠確保通信安全,與似乎,什麼天王蓋地虎、寶塔鎮河妖”開始登上了曆史舞台,其實暗號也就是加密,是對原始信息的隱藏,到近代,加密發展成了一門科學, 也演繹了很多關於加密/解密 攻防大戰的經典故事。

所以通過加密來保證通信安全是經過曆史考驗的可行方法。


二、加密學在網絡的延伸

傳統的加密大多都是對稱加密(symmetric),也就是上鎖和開鎖都用同一把鑰匙,但是internet是個天生就不安全的環境,一竄“my credit card num is 110945110945”從上海跑到北京,不知要經曆多少個路由器,交換機,在通信期間,如果有壞人(man in the middle)要竊取你的數據,更是如囊中取物。那就加密吧,不過如果采用對稱加密,而且這把鑰匙每個人都有的話,那就跟沒有加密是一樣的。

解決方法是不對稱加密(Asymmetric Encryption),詳細請參考上麵的reference.


三、怎樣保證數據的完整性?

OK, 采用不對稱加密後,我們的通信數據不再擔心被middle man竊聽了,但是新的問題來了(人類總是有追求卓越和完美的本能),我怎麼知道這個信息沒有被篡改過並且是真實有效的呢?

判斷有沒有被篡改過,我們有數字簽名(Digital Signature), 很簡單,sender用一套單向的哈希算法,生成源數據的摘要,此算法保證對源數據的任何更改都會產生不同的摘要,sender將源數據和摘要一起發給receiver,receiver收到數據後,用同樣的算法再生成一次摘要,並將其與sender發過來的進行比對,如果一樣,那麼就可以斷言信息沒有被更改過。


四、怎樣確保通信方身份真實有效?

數字簽名解決了數據完整性問題,那麼怎樣保證和你通信的人是真實有效的呢,這個身份認證的事情,必須通過第三方來做,因為自己不能為自己做證啊,你說你就是“招商銀行”,我憑什麼要相信你呢,任何人都可以說自己是招行。如果銀監會說,他確實是招商銀行,你可以放心把銀行密碼告訴他,你才敢放心,是不是。這一套解決信任問題的方案就是數字證書(Digital Certificate),這個第三方,我們管它叫CA(Certificate Authority), Authority應該是很有權威的,雖然不是銀監會,但也是絕對可靠可信的,比較知名的有VeriSign,被Symantec收購了,我們公司就在用這個。


五、認證(Authentication),授權(Authorization),訪問(Access)

輸入用戶名,密碼,登陸係統,哦,還有驗證碼微笑,早期的internet,包括現在的大部分應用,都是這種模式。但隨著internet 發展,越來越多的service provider,要開放自己的service給第三方應用訪問,特別是social network的興起,這種需求變得越來越強烈,幾乎變成大型網站的標配。

怎樣讓第三方應用訪問用戶資源,同時又不接觸到用戶的敏感信息呢?

如果傳統的用戶名,密碼登陸驗證,就以為著第三方必須知道user的用戶名,密碼,顯然不滿足我們的需求,怎麼辦呢? 一幫聰明的人仔細研究了整個驗證過程,然後將其分解、抽象成三個步驟,即認證(Authentication),授權(Authorization),訪問(Access)。這讓我不禁想起那句老話 “在計算機世界,任何問題都可以通過加一層來解決”,是的,加了Access Layer之後,前麵的要求就能滿足了,具體是怎樣實現的,參看下文。

分解後,將訪問資源同認證、授權解耦。也就是說認證、授權在一個地方先做,完成後獲得一個Access Token, 然後利用這個Access Token去訪問resource, 當然resource server要負責驗證這個token的有效性,怎麼驗證呢? 方法有多種,利用token作為reference id去Authorization server獲取相關信息是常見的方式。

通過此方式,第三方隻要引導user去完成Authentication 和 Authorization, 而不用touch到user credential information (username, password), 利用上麵步驟獲得的Access Token 再去訪問Resource server。 也就是OAuth的工作流程了。

    +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

                     Figure 1: Abstract Protocol Flow

參考:https://tools.ietf.org/html/rfc6749

最後更新:2017-04-03 16:48:56

  上一篇:go J2EE中關於tomcat的maxIdle、maxActive、maxActive相關配置
  下一篇:go Linux下安裝jdk報Permission denied以及chmod詳解