國內大多數網站的密碼在 post 傳輸過程中都是明文的,這正常嗎?

下午用Chrome自帶的審查元素看了下登陸過程,到目前為止(2012-6-20 16:26:45),發現這幾個網站是明文密碼的:知乎,豆瓣,博客園,verycd,未修改的wordpress最新版(個人博客)。


看到上面幾位的回答,我真心覺得,當前信息安全保護的意識過於低下,連一些基本的保護措施都能夠被認為是「沒有必要」。同意@任冬 的觀點,都在偷懶,不重視安全,沒有什麼理由好開脫的

如同@lumin 所說,信息安全的保護確實分成兩個部分,端的安全(可以具體到客戶端和伺服器端)和鏈路的安全,也就是傳輸過程中的安全。
一般我們可以認為,端都是可信的。對於伺服器端,你願意使用這個公司提供的服務,一個隱含的條件就是相信這個提供服務的公司,所以伺服器端可以認為是比較安全的。
而客戶端,你願意使用這台電腦,也表明你認為這台電腦是比較安全的。只有對於一些安全級別更高的業務,比如在線交易,才需要額外的再對客戶端的安全性做一次校驗。但是,要真正的保證客戶端安全是很難的,需要使用像可信計算這樣的技術。常見的能夠很大程度保護客戶端安全的設備,比如iOS設備、PSP之類的遊戲機,也是能夠遭到破解,所以這個問題至今沒有比較完善的解決方案。
通常我們認為,自己肯定不會給自己的電腦裝上木馬,網吧的老闆一般不會跟黑客一夥,也不會在網吧的電腦上裝木馬。所以保護的焦點,應該集中在通信的鏈路上,而不是端上,而且,在鏈路上進行竊聽,比在大部分時候在端上進行攻擊都來得有效和難以發現。

一個很簡單的例子,如果我用筆記本在一個外租房比較密集的小區,建立一個無密碼的WiFi熱點,保證很多試圖蹭網的人連接上來,然後如果我用WireShark(或者用WinPcap寫一個過濾程序),監聽WiFi收到轉發的數據包,那一定能截獲大批的用戶名和口令,至少,如果他上知乎,用戶名和口令我一定能得到。這個例子也說明了,各位千萬不要貪圖小便宜而去蹭別人的WiFi,這是一個對自己來說很危險的行為。

實施網路竊聽是如此的容易,甚至不需要額外安裝什麼黑客軟體就可以進行。對於很多場合,我們對於傳輸的內容被竊取並不關心,我不怕別人知道我看了什麼新聞,也不怕別人知道我在知乎回答了什麼問題,但是用戶名和口令這樣的身份鑒別信息是絕對不可以被竊取的,因為可能會引起一系列其他的安全問題,CSDN泄漏以後大家都在改密碼就能說明問題。對於關鍵身份鑒別信息在傳輸時進行加密是一種非常有必要,而且也是非常重要的事情。

至於安全成本問題,我覺得,一個開發人員的薪水一年是十萬以上,一年三五千的SSL證書,對於一個網站來說,根本就是九牛一毛。


沒有 HTTPS 的網站都是對用戶安全不負責任的。HTTPS 當然有成本,證書只是一方面,伺服器負責是另一方面。當然百度不願意實現 HTTPS 登錄,理由是伺服器成本,因為 HTTPS 加解密開銷是普通 HTTP 的幾倍。不過你看 Gmail 和 Facebook 都默認全站 HTTPS 了,你說你只有登錄做 HTTPS 也做不到,這就是基本的安全保障都不提供啦?


中國電信可以把你的HTTP請求替換為廣告和一個iframe,同樣可以截獲你的所有密碼。


都偷懶,不重視安全。這個沒什麼理由好開脫的。

一般來說,登錄的界面用https還是挺多的(技術實現比較簡便),但是有個問題就是第一次打開速度太慢。比http方式慢不少
很多遊戲的登錄都是這個方式,如:
http://sdo.com的登錄方式就是https的
http://passport.the9.com也是

為了保證瀏覽速度,可以採用js加密方式
用js加密可以採用非對稱加密技術,如:rsa加密演算法,就算中間人截獲數據包,也不知道真實的密碼
qq就有登陸採用js加密的,如:http://t.qq.com
http://weibo.com的登錄也是採用http+js加密方式
優點就是速度快

這兩個解決的都是傳輸過程中的安全,一般基本就夠用了。

如果還要解決輸入的安全,只能安裝瀏覽器插件了。比如很多銀行登錄,支付登錄,都會有要求,這個也要看插件和操作系統結合的緊密程度,我之前的主管可以寫程序截獲安裝了銀行插件的按鍵記錄。

最好還是開發這塊重視起來。


MD5加密雖然很弱,但一次MD5就可以防止相對安全的密碼被逆向出明文,然後再在其他網站使用。JS兩三行代碼的邏輯而已。
加個固定的鹽值,就能防止已有的彩虹表攻擊,多次MD5更是增加了碰撞攻擊的計算成本,至此,除了不能防止重放攻擊。
加動態token驗證,就需要服務端加邏輯配置,可以防止重放攻擊,但不能防止中間人攻擊。
HTTPS方式就安全很多,但HTTPS成本的確很高,一般網站不做這一步倒是情有可原。
安全是一步一步來的,不能因為某一步達不到絕對的安全,就棄而不用,哪怕簡單的MD5都有它的作用。

其實現在這麼赤裸的現狀,相對與程序員偷懶,我更相信是老大哥的陰謀論,來收集更多網民的明文密碼。


稍微糾正一下其它答案中的問題。

js加密(比如騰訊)沒什麼安全性可言,攻擊者只要把你訪問的頁面整個替換掉就可以了。共用路由器的話,用ARP病毒應該很容易做到。

按照類似的邏輯,只要在登錄的時候用戶看不到地址是https,任何「其它方法」都不安全。就不必討論js或者類似方案了。

就算是用插件登錄,在很多時候,攻擊者也可以修改頁面,讓輸入框根本不使用這個插件。所以除非插件另外有驗證頁面內容的功能,還是不能不使用https。而且就算使用https,對於本地的病毒之類的問題,有些插件也不能阻止攻擊者繞過這個插件。

比如以下GreaseMonkey腳本在Linux,Firefox中驗證成功,Windows和其它瀏覽器就不逐個嘗試了(如果Windows不行的話,還有一種合理的解釋是Linux版僅僅用於避免Windows用戶訪問「更不安全」的頁面)。以下腳本僅僅用於驗證概念。真正用於攻擊的話,首先要把頁面做得和支付寶官方頁面比較像,還要能自動給Firefox安裝腳本,最好還能避免用戶發覺,讓用戶以為登錄不上去是因為網路錯誤或密碼錯誤。

// ==UserScript==
// @name alipay hacker test
// @namespace afdsjalfwhahefhwadskla
// @include https://www.alipay.com/
// @version 1
// @grant none
// ==/UserScript==
document.body.innerHTML="&

tps://www.example.com" method="get">&&&&"

所以說,插件在很多時候也都是自欺欺人。可能阻止了一部分流行的病毒的行為,但是有針對性的攻擊是否也能阻止,難說。只考慮網路安全的話用https即可,不需要另外的插件。

更進一步地說,考慮病毒的影響的話,某些直接使用自己的客戶端的驗證方式也無法保證安全。比如某個病毒作者自己做一個登陸框,替換掉QQ.exe,QQ自身沒有任何防範方法。只是用戶很快就會發現問題而已,因為登錄不上去。對QQ可能影響不大,但是想像一下要是有銀行用類似的方法,病毒可以在攻擊者得到密碼之後,立即破壞系統文件,切斷用戶的網路,可以稍微用藍屏之類的方式掩飾一下,避免用戶很快直接聯繫銀行,然後攻擊者立即將用戶的存款轉出。只是病毒的體積可能有些大,看現在的網速可能也不是很大的問題。

網速比較快的話,USB Key也可以做個程序遠程與硬體交互,攻擊者那邊再裝個虛擬的硬體驅動,實在不行就用虛擬機。有些設備可能解決了這些問題,畢竟網路不太可能完全沒有延遲,而且帶寬有限。有些設備可能沒有,或者目的僅僅是避免依賴於密碼。

但是比如說,使用手機簡訊驗證,而且保證手機不中毒,或者比如說使用帶有屏幕的USB Key,那麼應該是安全的。不過個人認為受盜號影響不大的普通網站沒必要在用戶自己中毒造成的問題上下太多功夫。這是用戶自己和殺毒軟體的責任。

另外關於明文存儲密碼,有些人有概念錯誤(以下專業的人可以不必看)。明文存儲密碼不是要避免有人用用戶的密碼去登錄其它網站,而是在網站自身的資料庫泄露之後,避免有人直接用泄露的密碼直接登錄自己的網站。「從技術上保證一個網站的密碼不能用於登錄另一個網站」,不應該是網站的責任,而是瀏覽器應該做的事,雖然現在沒有哪個瀏覽器做了這件事。

伺服器的資料庫的所謂密碼加密,其實是不可逆的hash,hash之後直接與資料庫比較。但是js加密(或者https加密)要是用同樣的方法的話,攻擊者得到加密之後的內容,就可以跳過js加密的步驟,用加密後的內容直接通過驗證。所以任何客戶端的加密方法,都應該保證一個加密後的數據不能重複使用兩次。使用的演算法一般應該是可逆的,也有一些其它方案,比如兩次操作順序可交換的不可逆演算法。

所以以上就有三種不同意義的加密:1.用戶在不同網站上使用不同的密碼;2.傳輸過程中的加密;3.網站自身資料庫的加密。如果要達到目的,任何兩個都不能共用同一加密過程。

第一條比起在瀏覽器上實現這個功能,現在似乎有個另外的趨勢是用一個賬號登錄多種服務。實際上有一些安全隱患,因為某些不重要的小網站可以用QQ、微博賬號登錄,某些購物網站一樣也可以用QQ、微博賬號登錄。這樣在某些明知不安全的環境,可能比如一些網吧,注重安全而又想登錄小網站的人就會比較困擾。

補充:本答案的主要目的是「稍微糾正一下其它答案中的問題。」太長無法作為評論,而且很多答案的問題相似,所以作為一個答案發出來,僅此而已。所以以上各段大體上說的也不是同一件事,也不都與題主的問題有關。如果對某一部分本來就沒有疑問,也沒有看到別人與此矛盾的說法,可以自行忽略。

關於病毒的部分,我沒有打算特別去說病毒的問題,也不認為一般網站應該考慮病毒的問題。只是因為看到有其他回答把插件和https相比較。我是說很多瀏覽器插件並不能完全代替https的作用,所以兩者很難直接比較。就算用js+插件的方式,如果不實現完全類似於https的功能的話,也很難達到https那樣的安全性。

簡單地說:
1.arp攻擊可以篡改數據;
2.篡改程序的形式的中間人攻擊基本無技術含量;
3.只要地址欄不寫https,或者用戶不明確知道地址欄應該是https,就有篡改程序的機會;
4.大部分插件並不能代替https,即使用了插件也同樣需要https,除非這個插件也具備某些人所認為的https的全部「缺點」;
5.要達到伺服器不保存明文密碼所要實現的目的,一般服務端需要把傳輸的數據還原成明文,前後兩個步驟互相獨立,不能混同,也存在其它方法,但是客戶端的操作也不是簡單的hash,即使是不能防止篡改數據的js加密,也應該確實是加密,而不是只有hash;
6.是否明文傳輸密碼(題主的問題)、是否明文保存密碼、是否能防止一個網站密碼泄露影響其它網站,是三件不同的事,不建議混合起來討論,就像我這樣;否則可能導致很多誤會,就像我這樣。


大家的安全意識不強,有些互聯網公司為了減少成本,在安全方面能省就省,導致很多重要系統登陸頁面連最省錢最基礎的SSL證書也沒有安裝。


這個沒什麼好說的,明文post用戶的登錄密碼就是對用戶的侮辱,除非用的https。一般來說網站沒有義務保證客戶端安全(用戶使用安全的瀏覽器,保證本地輸入不被偵聽),但是從發出post請求,再到伺服器驗證,這個過程必須加密。純md5加密,因為現在md5被破的差不多,大部分用戶的密碼也相對簡單,所以嚴格來說並不安全。至於@lumin 說的第二種方法,雖然js是公開的,但是使用非對稱加密,或者直接用md5 sha1之類的是沒問題的


你覺得有區別嗎?
登陸是個發包的過程,如果如你所說:在客戶端做個MD5處理再發過去

1、包被截留,無論密文有沒有加密,直接按數據發包,依舊能登陸沒有任何區別。
2、如果是做MD5處理,服務端直接校驗Hash值

if POST過來的值==資料庫的值:
通過

那麼被拖庫的話,根本不用跑彩虹表了,直接用密文登陸了。
當然,這點有更好的解決辦法就是客戶端發MD5值,服務端password欄位保存MD5(客戶端傳來的數據+salt)並校驗。
3、手機移動頁的問題,我自己做個人項目的移動頁一般Gzip後控制在20KiB以內(靜態結果頁、js、CSS等的綜合,不包含頁面圖片),如果要在移動頁上也做一個MD5,引入一個MD5處理函數,就10KiB了,當然這不是大問題,萬一窮鬼們為了省流量,用Opera Mini之類的壓縮、不支持JavaScript的瀏覽器呢?
因為我自己就是一個用EDGE網路,100MiB月流量的窮鬼,我相信雖然知乎大部分人看起來都很光鮮,但是像我這樣的窮鬼一定為數不少。

所以就這樣來看,如果發的包可以被截留,那麼做不做MD5加密,都不會影響黑客偽造登陸。
所以你這種想法還是Naive,同樣的發包可以被截留的環境,你設想的並不會更安全,反而削弱了用戶體驗。
如果不考慮用戶體驗來做前端安全這塊,該怎麼做呢?

我會在session里建立密碼與被打亂的小鍵盤的映射,然後把映射生成圖片發送到前端,用戶發送的密碼經過混淆,在後端進行校驗,校驗一次,然後銷毀映射。
這樣雙端加密,即使被抓包也是安全的。
或者直接https。


看到答案里有人提到用 MD5 代替明文,這樣做其實是沒有意義的,第一可以重放,第二可以用彩虹表。

老老實實上 SSL 吧。


看了答案發一下自己的總結加看法:https是ssl加密的http隧道,這是正規而且是未來的普遍方法。實現條件:服務端需購買ssl證書;伺服器軟體開銷增加。其他是非正規方法,js加密尤其是。偏要反逆ssl大潮而行的公司不是好公司。


這裡其實提到安全問題,對於安全問題應該分為以下幾種階段:
1、客戶端安全(表現為數據錄入時的安全)
2、客戶端到服務端之間信息傳輸安全(也就是你提到的數據傳輸時的安全)
3、服務端的安全(服務端密碼存儲的安全)

應該說是絕大多數網站因為安全界別的關係只要保證服務端安全就可以了,所以你看到的很多網站都是明文傳輸的!

如果非明文,有幾種做法:
1、HTTPS,做加密簽名
2、js加密後傳輸(不確定,因為很少這樣做,但我覺的應該是可以的)
3、做瀏覽器插件,進行數字信息保護。

但其中還有問題。
1、2都無法做到絕對的安全,因為鍵盤是可以程序監控的。智能保證客戶端到服務端傳輸過程中的安全。
3可以做模擬鍵盤,點擊輸入。相對來說無法做到鍵盤監控,而且傳輸數據也有保障。
2用JS加密因為JS腳本本身就是可下載的,所以加密方式泄露也會產生不安全問題。而且我很少看到有用JS加密後進行傳輸的。

其實能看出要做到絕對的安全,成本比較高。所以網站基本都會評估自己對帳號信息所要保證的安全級別再結合自己本身的業務來選擇做到什麼程度。

安全界別最高的,涉及到金錢交易,比如:電子商務,網銀等。都採用第3種做法。
安全界別稍高的,需要注意到信息丟失代碼的一些列影響,比如,微博的APP種的API KEY等信息丟失帶來的一系列後果和影響。
安全界別較低的,只要保證帳號在平台內足夠安全就可以了,比如:知乎、豆瓣等。因為密碼丟失本身不會帶來過於嚴重的問題,內容丟失、剽竊、亂輸入相對來說影響較小,而且容易恢復。

所以一般明文傳輸的網站用戶協議裡面應該會包含用戶應該自己保證自己的帳號安全,如果是用戶丟失的(未到達服務端之前),後果由用戶承擔,如果網站弄丟了,則站方承擔責任。

明文傳輸成本較低,而且一些網站不需要那麼高級別的要求,再加上如果真用高級別的安全來要求一些不需要很高安全級別的網站,也會帶來一系列很麻煩的問題。你希望在你上知乎的時候下載安裝插件嗎?估計你會逼瘋。

所以明文傳播也比較正常。


如果是因為網站明文存儲你的密碼,導致損失,那就是網站方的責任了。
如果是因為你在傳輸過程中被監聽了,導致損失,那大部分用戶會覺得這是個人的問題。
所以作為一個網站來說,在伺服器端會使用MD5來存儲你的密碼,但是不會去考慮使用 https 的方式去保證傳輸的安全性。


簡單的安全證書似的加密就夠了,其他都是錦上添花的東西。簡單點說,攻擊都是具備目的性的,無目的的攻擊我們類似於隕石砸到頭。網站的責任假如你做過運營就知道了,首要責任就是保證服務端安全,所以服務端主要保存的就是md5加密。至於網銀的安全主要就是第三方提供,網站不保證。用戶登錄的安全主要是用戶必須保證自己電腦安全,假如中了病毒你什麼加密也是白扯了,當然我指的是瀏覽器,因為瀏覽器是第三方的,沒辦法保證。其次就是成本,類似知乎豆瓣等等網站,本來用戶就沒什麼值錢的東西。安全成本跟收益不成比例,所以沒必要做。至於oauth,你覺得一定安全嗎?我做過模擬twitter登錄,可以將twitter的oauth跳轉代理到我自己的頁面,也就是說你其實沒有跳轉到twitter驗證,而是跳轉到我的頁面驗證,然後我的後端代理到twitter驗證,然後得到返回值。就算是https仍然難以避免,所以網站客戶端的安全其實還是在於用戶自己是否有安全意識,當然我做twitter驗證是給我自己做的,因為國內沒辦法跳到國外twitter頁面去驗證,我看了一下以前其他做的twitter驗證,也是跟我一個路子。


現在的程序員都懶+沒需求去做。
有錢並且認識到用戶密碼是用戶隱私的公司用ssl,小公司沒錢或者沒需求。

其實做這個也非常簡單,關鍵是非對稱加密和鹽:post之前js生成一個鹽(後端發鹽的安全性高點),然後把密碼和鹽用非對稱加密演算法的公鑰加密,然後post提交鹽和加密之後的密碼,後端接收之後用鹽和私鑰解密就得到用戶的輸入密碼了。

至於防重放,關鍵是時間戳與簽名。可以由後端發鹽和時間戳和公鑰,然後由js計算與伺服器的時間差,等提交的時候提交一個與後端當前時間誤差極小的時間戳和鹽的公鑰簽名,後端驗證時間戳誤差在安全範圍之內且當前時間戳大於上次請求的時間戳,然後簽名一致即可。

防中間人在理論上不可行,主要是http協議是無狀態,中間人很容易就能偽造請求,並且前端想知道這個請求來自可信的後端是不可能。據我目前所了解的知識來說,ssl可以實現相對安全,前提是由人來確保根證書的可信列表以及識別瀏覽器給出的證書警告信息。

不過題主的本意我理解為預防http協議下網路嗅探等直接暴露明文密碼的方式,只要實現了用戶密碼加密與防重放,其實就夠了。

手機碼字不容易,輕噴!


不安全。
我兩年前做過一個測試,用代理伺服器截獲瀏覽器的請求,在截獲的報文中,明確可以看到用戶填寫的用戶名密碼。這意味著,在網路傳輸的任何一環,只有有人截獲http報文,就可以看到用戶名密碼信息。理論上,提供wifi的計算機是可以用代理直接截獲用戶信息的。


the big brother is watching you


提供一個方案供參考。
客戶端做md5/sha1,post到服務端;
服務端再對post過來的內容做md5/sha1;
最後跟資料庫中保存的密碼比對。

-----------------------------------------------------
這個方案只能保證即使後台資料庫泄露,也不會暴露用戶的初始密碼。
評論中知友提到的線路被監聽的情況,這方案依舊無力。


加密需要計算量,money啊!!,不是誰都能像google那樣財大氣粗的!!沒有絕對的安全,對於商業公司,利益與安全的權衡,得與失的權衡更重要。


國外大小公司很多都有全站ssl,國內三巨頭都沒有,包括BABA,要麼支付搞下,要麼登錄通行證搞下,其他免談。。。


推薦閱讀:

Python 3 網路爬蟲學習建議?
如何理解 Web 語義化?
如何精準地找到 SYN 攻擊者的真實 IP ?
極路由和普通路由有什麼區別?

TAG:知乎 | 網路安全 | 網站 | 密碼 | 計算機網路 | 豆瓣 |