安全的數(shù)字化身份系統(tǒng)––密碼與會話
聊數(shù)字化身份系統(tǒng)首先我們先看登錄赦邻,對于登錄大家并不陌生,訪問系統(tǒng)幾乎都需要登錄实檀。因為系統(tǒng)也不知道是誰在訪問惶洲,所以需要你告訴系統(tǒng)你是誰,還需要證明你真的是你,如何證明膳犹?給系統(tǒng)展示你的密碼恬吕,因為密碼只有你才擁有,你有這個密碼须床,你就能證明你真的是你铐料,這就是一個登錄。
看似簡單的幾個步驟豺旬,但里面涉及的安全問題卻有很多钠惩。
密碼安全:密碼存儲安全,密碼傳輸安全族阅,無密碼技術(shù)安全......
會話安全:會話標(biāo)識存儲安全篓跛,會話標(biāo)識傳輸安全.....
首先我們看關(guān)于密碼存儲安全的問題。系統(tǒng)服務(wù)器需要存儲用戶密碼坦刀,才能在用戶登錄時驗證密碼的正確性愧沟,但存儲就會有泄露的風(fēng)險,比如數(shù)據(jù)庫被偷鲤遥,服務(wù)器被入侵沐寺,內(nèi)部員工泄露數(shù)據(jù),被撞庫等風(fēng)險盖奈。因此我們需要認(rèn)真地考慮如何安全存儲用戶密碼混坞。
我認(rèn)為作為一名軟件開發(fā)工程師, 嚴(yán)禁明文存儲密碼是common sense卜朗。 那該如何解決不能明文存儲密碼的問題拔第?也許看官你會說,md5 场钉? 沒錯蚊俺,md5 可以。那么md5屬于什么逛万?它是一種單向散列算法泳猬,單向散列算法主要就是通過算法生成一個摘要批钠,來解決密碼不能明文化問題。 比如:
```
md5(123456) = e10adc3949ba59abbe56e057f20f883e
```
這樣雖然能解決密碼不明文化得封,但是它還是會存在安全問題埋心。因為現(xiàn)代計算機的計算能力實在太強了,一秒可以計算十億次 忙上,可以通過窮舉對比的方式破解密碼拷呆。這也就是所謂的彩虹表攻擊。
解決被彩虹表攻擊的問題對密碼也有一定的要求疫粥,比如要求密碼的復(fù)雜度茬斧,需要不同類型的字符進(jìn)行組合,在生成摘要時加點鹽來防止窮舉破解密碼梗逮。但這就安全了嗎项秉?還不夠。一次算法遠(yuǎn)遠(yuǎn)不夠滿足安全要求慷彤,如md5(md5(md5(password+salt)))娄蔼,現(xiàn)在往往采用自適應(yīng)的方式來存儲密碼,可以設(shè)置重復(fù)計算一萬次底哗,鹽使用隨機生成的16+位字符串岁诉。這種方式雖然性能不會很好,但對于密碼生成摘要存儲來說艘虎,性能不好往往是好事唉侄,畢竟用戶注冊或修改密碼只是一次操作咒吐,用戶是可以接受的野建,但對于黑客來說,這是致命的恬叹,黑客從原來的一秒產(chǎn)生幾百萬甚至上千萬的md5值候生,變成了一秒只能產(chǎn)生一個,黑客想要破解一個密碼绽昼,從現(xiàn)代的計算機算力來看唯鸭,需要上千年的時間。目前推薦的使用密碼存儲算法已不再推薦md5了硅确,推薦采用Bcrypt ? Scrypt ? pdkdf2算法目溉。
(很多可以通過MD5/SHA值進(jìn)行反向查詢,都是已經(jīng)存儲了大量的彩虹表)
解決了密碼存儲安全菱农,再來看密碼傳輸安全缭付。有人會說使用https就能解決網(wǎng)絡(luò)傳輸?shù)陌踩珕栴},但這還是不夠循未。瀏覽器到認(rèn)證服務(wù)器之間請求可能會經(jīng)過一層或多層gateway陷猫,如nginx,zuul,spring cloud gateway等绣檬。很多系統(tǒng)都是在gateway處安裝證書設(shè)置https協(xié)議足陨,瀏覽器到gateway處是加密傳輸?shù)模玤ateway到認(rèn)證服務(wù)器還是http協(xié)議娇未。攻擊人可以在這條鏈路上竊取明文密碼墨缘,那全鏈路https不就可以解決問題了?還不夠零抬,這些gateway內(nèi)部都可能會接觸到明文密碼飒房,都有密碼泄露的風(fēng)險,有些gateway不是我們負(fù)責(zé)的媚值,無法保證他人會不會開個后門拿出明文密碼狠毯,或者安全意識較低的程序員打印日志不小心把明文密碼打印出來。那如何解決這個問題褥芒?我們可以采用瀏覽器傳輸密碼之前就對密碼先加密的方法嚼松。
加密方式分為對稱加密與非對稱加密。
對稱加密:加密與解密用的是同一個密鑰锰扶。如DES献酗,AES
非對稱加密:加密與解密用的是不同的密鑰,一個叫公鑰坷牛,一個叫私鑰罕偎,公鑰加密的數(shù)據(jù)只能由對應(yīng)的私鑰才能解,如RSA京闰。
如果采用對稱加密方式颜及,需要瀏覽器在調(diào)登錄api之前,先獲取認(rèn)證服務(wù)器的密鑰蹂楣,拿到密鑰后對密碼進(jìn)行加密傳輸俏站,經(jīng)過的gateway都只能獲取密文,密碼到了認(rèn)證服務(wù)器痊土,認(rèn)證服務(wù)器再通過密鑰對密文進(jìn)行解密肄扎,獲取到密碼明文,就可以進(jìn)行密碼驗證赁酝。但有一個安全問題犯祠,瀏覽器獲取密鑰也會經(jīng)過gateway,如果gateway把密鑰也打印到了日志中酌呆,密文也打印到了日志中衡载,那攻擊人同樣可以通過日志獲取明文密碼。
既然對稱加密不可取肪笋,我們來看看非對稱加密月劈。瀏覽器登錄前經(jīng)過gateway獲取認(rèn)證服務(wù)器的公鑰度迂,使用公鑰進(jìn)行加密,最終密文到認(rèn)證服務(wù)器猜揪,再通過私鑰解密拿到明文密碼進(jìn)行密碼認(rèn)證惭墓。這種方式gateway只能拿到公鑰和密文,無法解密而姐,就算打印到日志中腊凶,攻擊人無法拿到明文密碼了。
但這樣就安全了嗎拴念?
如果攻擊人拿gateway中的密文直接去調(diào)認(rèn)證服務(wù)器中的登錄api钧萍,認(rèn)證服務(wù)器一樣可以通過私鑰進(jìn)行解密,并登錄成功政鼠。所以我們還需要加一些限制:保證密文有過期時間风瘦,并且是只能使用一次。
瀏覽器獲取認(rèn)證服務(wù)器公鑰時公般,攜帶用戶名到認(rèn)證服務(wù)器万搔,認(rèn)證服務(wù)器生成隨機數(shù)并與用戶名關(guān)聯(lián),隨機數(shù)只保存5分鐘官帘,隨機數(shù)與公鑰一起返回給瀏覽器瞬雹。瀏覽器使用隨機數(shù)加密碼通過公鑰一起加密調(diào)登錄api,認(rèn)證服務(wù)器通過私鑰解密刽虹,獲取到明文密碼與隨機數(shù)酗捌,驗證隨機數(shù)的有效性與合法性,都正常就進(jìn)行正常登錄涌哲,比較完隨機數(shù)后立刻刪除隨機數(shù)胖缤,如不正常拒絕登錄。攻擊人就算獲取到了密碼密文膛虫,公鑰草姻,隨機數(shù),也只能在5分鐘之內(nèi)趕在gateway正常請求登錄之前稍刀,發(fā)起登錄攻擊,但這個難度太大敞曹。
還有就是認(rèn)證服務(wù)器保證客戶端是gateway或可信的服務(wù)發(fā)起的請求账月,認(rèn)證服務(wù)器可以對客戶端做白名單限制,方式有很多種澳迫,在這就不一一贅述了局齿。
但現(xiàn)在就安全了嗎?還真不一定橄登。如果攻擊人攻破了gateway抓歼,在瀏覽器請求認(rèn)證服務(wù)器獲取公鑰時讥此,gateway返回攻擊人頒發(fā)的公鑰,待用戶輸入完賬號密碼后谣妻,瀏覽器雖然進(jìn)行了加密萄喳,數(shù)據(jù)到了gateway,攻擊人再通過自己的私鑰進(jìn)行解密拿到明文密碼蹋半,再通過明文密碼在登錄頁進(jìn)行正常的登錄他巨,同樣可以登錄成功。因此瀏覽器也需要做安全驗證减江,驗證公鑰的合法性染突。認(rèn)證服務(wù)器可以采用CA機構(gòu)頒發(fā)的公鑰,認(rèn)證服務(wù)器與瀏覽器都相信CA機構(gòu)(做安全總得相信點東西辈灼,如果什么都不信任就沒法做安全了份企,有永無止境的安全問題),通過CA機構(gòu)的方式驗證公鑰的合法性來避免中間人篡改公鑰的問題(講得不是很清楚巡莹,比如CA機構(gòu)是個啥薪棒,為什么CA機構(gòu)可信?這里面可聊的話題太多榕莺,有興趣可以查看《密碼學(xué)與網(wǎng)絡(luò)安全》等書籍或一起探討研究)俐芯。
那密碼安全了嗎?還是遠(yuǎn)遠(yuǎn)不夠钉鸯。比如黑客知道了你密碼的長度吧史,可以不斷地調(diào)登錄或修改密碼的接口來試錯,總會試出來正確的密碼唠雕,因此需要對任何會驗證密碼合法性的接口都需要加頻率限制贸营。如登錄連續(xù)錯了5次鎖5分鐘,再錯5次鎖半小時岩睁,防止黑客試出密碼钞脂。但這種方式也有問題。如競爭對手公司不斷地使用用戶的賬號和錯誤的密碼去登錄捕儒,導(dǎo)致用戶的賬號一直處于被鎖狀態(tài)冰啃,正常用戶也沒法使用,這就違背了安全中的可用性刘莹。那就需要加ip限制和驗證碼機制了阎毅。為了用戶的體驗性,可以做成第一次登錄用戶可以正常登錄点弯,錯誤之后扇调,就需要使用驗證碼的方式登錄,超過5次鎖定賬號抢肛,同一ip登錄錯誤次數(shù)過多狼钮,將ip加入黑名單中碳柱。
密碼有很多安全問題,復(fù)雜密碼對于用戶來說也挺麻煩的熬芜,那采用無密碼技術(shù)莲镣。沒有密碼是不是就安全了呢?雖然現(xiàn)在可以采用指紋登錄與刷臉登錄猛蔽,但新的安全問題也隨之而來剥悟。密碼是需要私密性的,但指紋可以從照片中獲取曼库,美國國防部某個官員因在拍照時露出了大拇指区岗,隨后就有了這個大拇指的清晰指紋圖(拍照的時候不要剪刀手或點贊了,最好指紋對準(zhǔn)自己吧毁枯,手動狗頭)慈缔。還有就是存在不確定性,刷臉登錄時种玛,如果燈光太暗或太亮藐鹤,臉部受傷了,化妝了赂韵,那登錄能保證成功嗎娱节?臉部相似的人,登錄時能保證區(qū)分開來嗎祭示?如果不能就違背了賬號唯一性肄满,日后審計也是個問題。還有一個問題就是不可修改质涛。當(dāng)密碼泄露了可以修改密碼稠歉,但你的指紋已經(jīng)作為登錄憑據(jù)了,換個手指頭就好了汇陆,當(dāng)十個手指頭都用過了怒炸,那是不是該用腳指頭了?當(dāng)然無密碼肯定是比有密碼使用上更方便快捷毡代,隨著技術(shù)的發(fā)展阅羹,這些問題也都會解決,只是也會有更多的安全問題月趟。
我們再來看會話安全(密碼安全還有各種各樣的問題灯蝴,篇幅有限,不再聊了)孝宗。