起因:是一個90後團隊搞的一個流氓公司,做 Mac 下的盜版應用商場,被罵了一通,同時調侃 http 協定明文傳輸使用者名密碼,太低級。後來有個人站出來,提出“前端對資料進行加密沒有意義”這個觀點。後來就是的罵戰了。。。
無意義說:密碼在前端加密完全沒有意義,對密碼系統的安全性不會有任何提高,反而會引發不必要的麻煩。
(1)加密了也無法解決重放的問題,你發給伺服器端的雖然是加密後的資料,但是黑客攔截之後,把加密之後的資料重發一遍,依然是驗證通過的。直接監聽到你所謂的密文,然後用腳本發起一個http請求就可以登入上去了。
http在網絡上是明文傳輸的,代理和網關都能夠看到所有的資料,在同一區域網路内也可以被嗅探到,你可以開個wireshark抓下區域網路的包試試看。加密也沒有提高什麼攻擊難度,因為攻擊者就沒必要去解密原始密碼,能登入上去就表示目标已經實作了,是以,難度沒有提高。
(2)既然是加密,那麼加密用的密鑰和算法肯定是儲存在前端的,攻擊者通過檢視源碼就能得到算法和密鑰。除非你是通過做浏覽器插件,将算法和密鑰封裝在插件中,然後加密的時候明文混淆上時間戳,這樣即使黑客攔截到了請求資料,進行重放過程時,也會很快失效。
有必要說:
(1)明文傳輸的是第三方的密碼:Apple ID 與密碼。因為這個是使用者在另一個網站的資料,如果加密之後,雖然攻擊者可以通過重播攻擊重新進行登入,但是加密情況下無法擷取到原始的 Apple ID 的賬号和密碼。不加密的話如果HTTP請求被攔截的話就可以知道使用者的原始密碼了,這是一件要不得的事情。于你網站本身來說,這個問題應該不大,因為如果被攔截了,不管怎樣攔截者隻要檢視源碼,模拟請求之後都能登陸上。但是因為很多使用者目前來說基本上來說不會一個網站一個密碼,而是對應着多個賬戶的。是以如果知道了使用者的原始密碼,結合社會工程學,能幹的事情就挺多了。
(2)加密更安全,不是為了完全阻擋攻擊,而是為了提高攻擊的成本,降低被攻下的機率。
QQ 網頁上的登陸子產品(全程HTTP/GET請求):
function getEncryption(password, uin, vcode, isMd5) {
var str1 = hexchar2bin(isMd5 ? password : md5(password));
var str2 = md5(str1 + uin);
var str3 = md5(str2 + vcode.toUpperCase());
return str3
}
password:密碼
uin:使用者名vcode:驗證碼
白話就是: md5(md5(md5(密碼) + 使用者的QQ号) + 驗證碼)
驗證碼是一次性的, 是以,在你在網絡層拿到本次的請求之後,無法做 重播攻擊, 因為驗證碼是不正确的.加入驗證碼的作用:防止軟體惡意注冊,防止暴力破解密碼,防止網絡爬蟲,Google利用驗證碼,讓使用者幫他實作圖檔的識别。
而當你擷取新的驗證碼, 但你并不知道 組合之前的内容[md5(md5(密碼) + 使用者的QQ号)] 是什麼 , 是以你無法重新發送本次請求實
現登陸的目的.前端加密,即在資料發送前,将資料進行哈希或使用公鑰加密。如果資料被攻擊者擷取,拿到的則不再是明文
是以即便資料被劫持了,由于各個網站的加密規則不一樣,最多也就是這一個網站的資訊被盜
至于 服務端的校驗, 隻要将記錄下來的MD5值(而不是記錄的明文), 進行同樣的運算, 得到的結果與送出上來的一樣, 即密碼正确.
安全點的方法:通過https協定送出登入資料,這樣黑客抓包時得到的資料是加密的,而且無法反解。
---------------------
作者:HLA_胡
來源:CSDN
原文:https://blog.csdn.net/hla199106/article/details/45114801?utm_source=copy
版權聲明:本文為部落客原創文章,轉載請附上博文連結!