手機驗證碼登錄的原理很簡單,對於壹個正常的登錄流程,看下邊這張圖就夠了:
實際應用中會存在壹些收不到驗證碼的情況,可能的原因如下:
針對收不到短信的問題,系統中會增加重發驗證碼功能,如果多次重發還收不到,系統可以支持上行短信或者語音驗證碼的方式,這兩種方式都是短信驗證碼的變種。
手機驗證碼的安全風險主要是被惡意利用和竊取。
因為手機驗證碼的應用十分廣泛,為了有壹個更全面的認識,這裏說的安全風險沒有局限在登錄這壹點上,所有使用手機驗證碼的場景都可能存在。這裏的應對策略主要是站在系統開發者的角度,通過各種技術方案來解決或者降低手機驗證碼的安全風險。
詐騙者先獲取到用戶手機號,然後冒充金融機構、公權力部門、親朋好友,在應用中輸入用戶手機號請求驗證碼後,向用戶索要對應的手機驗證碼,用戶稍不註意可能就會造成金錢損失。
針對此類問題,系統開發者可以考慮如下壹些方案:
還有壹種相對隱蔽的詐騙方式,詐騙者直接向用戶發送仿冒釣魚網站的地址,用戶在釣魚網站獲取驗證碼時,詐騙者拿著用戶手機號去真實網站請求驗證碼,此時用戶會收到壹個真實的驗證碼,用戶在釣魚網站輸入驗證碼後,詐騙者就可以拿著這個驗證碼去真實網站使用。
針對這種情況,前邊的識別用戶常用登錄特征的方式仍然有效。此外短信平臺和電信運營商也有責任對短信內容進行把關,短信平臺需要驗證發送者的真實身份、審核短信內容,並提供動態的流量控制機制,這樣可以過濾掉絕大部分詐騙短信。
其實電信運營商是能夠識別手機位置的,如果電信運營商能夠提供壹種安全的位置認證服務,也可以解決大部分驗證碼詐騙問題,比如前端提交驗證碼認證時攜帶電信運營商提供的位置標識,應用服務商可以拿著這個位置標識去找電信運營商驗證位置,當然這只是壹個設想,現實中還沒有這種方法。
可能有兩種場景下的短信攻擊:
此類操作首先會浪費短信資源,給應用服務商造成損失;惡意攻擊還會向無辜的用戶發送大量短信,造成騷擾攻擊。
應對這種問題,可以考慮如下壹些方案:
但是這種控制要盡量以不影響用戶的正常業務操作為前提,否則就得不償失了。
假設用戶收到了登錄驗證碼,輸入正確後提交服務端驗證。在從手機端到服務端的傳輸過程中,會經過很多的網絡設備和服務器系統,登錄提交的內容有被攔截獲取的可能,此時攻擊者就可以阻斷請求,自己拿著用戶的手機號和驗證碼去登錄。
應對這種問題,壹般需要對網絡傳輸內容進行加密,比如現在常用的https通信,可以保證兩端之間的傳輸內容安全,不被竊聽。對於傳輸安全,壹般這樣處理也就夠了。
不過https也不是銀彈,如果有攻擊者在客戶端偷偷導入了自己的證書,然後讓網絡請求都先通過自己進行代理,再發送到目標地址,則攻擊者還是能夠獲取到請求內容,想體驗這種方式的可以使用fiddler試試。還有https證書存在錯發的可能,如果給攻擊者發放了別人的證書,此時安全傳輸也就沒什麽意義了。
為了更高的安全性,傳輸內容可以在應用中加解密,客戶端對要傳輸的數據按照與服務端的約定進行加密,然後再發送到網絡,攻擊者截獲後,如果沒有有效的解密手段,則可以保證數據不被竊聽。加密的重點是保證密鑰安全,不被竊取和替換,可以采用其它安全信道傳輸,甚至線下傳遞的方式。對於驗證碼這種僅做驗證的數據,還可以通過加鹽後進行慢Hash運算,攻擊者即使拿到了傳輸內容,要進行破解的難度也相當巨大。
如果系統上安裝了惡意軟件或者非官方版本的軟件,特別是在盜版系統、被Root或者越獄的手機系統中,攻擊者也能比較容易的攔截並竊取短信驗證碼;同時網絡竊聽中的加解密也可能失去作用,因為軟件已經不可信,在不同的操作之間有沒有發生什麽貓膩,很難確定。
最近幾年在移動設備上引入了壹個稱為可信執行環境(簡稱TEE)的概念,獨立於操作系統,單獨的應用,單獨運行,有的甚至有單獨的處理器和存儲,外部很難進入和破解。壹些關鍵的操作都封裝在這裏邊,比如指紋的采集、註冊和認證,密鑰的生成和使用,版權視頻的解碼和顯示,等等。如果把短信驗證碼的處理也放在這裏邊,無疑會安全很多,不過這要解決很多通信方面的問題,收益與成本可能不成正比。在臺式機中這壹技術還所見不多,可能臺式機的環境已經有了比較成熟的安全體系,不過從移動端遷移過來的難度應該也不大。
短信嗅探也是壹種竊聽技術,不過是通過攻擊電信網絡通信的方式。
現在手機壹般都使用4G、5G網絡了,但是“短信嗅探”技術只針對2G網絡,不法分子通過特殊設備壓制基站信號,或者選擇網絡質量不佳的地方,或者使用4G偽基站欺騙手機,這會導致網絡降頻,使手機的3G、4G通信降低到2G。
2G網絡下,只有基站驗證手機,手機不能驗證基站,攻擊者通過架設偽基站,讓目標手機連接上來,然後就能獲取壹些連接鑒權信息,再冒充目標手機去連接真基站,連上以後撥打攻擊者的另壹個手機,通過來電顯示得到目標手機號碼。
基站本身並不會用特定方向的信號與每部手機通信,而是向四周以廣播的形式發送信號。所以每部手機實際上也是可以接收到其他手機的信號,2G網絡傳輸數據時沒有加密,短信內容是明文傳輸的,就可以嗅探到目標手機的短信。加之2G通訊協議是開源的,所以這件事的技術門檻並不高。
因為這種攻擊要求手機不能移動,如果基站切換就沒用了,所以攻擊壹般選擇夜深人靜的時候。對於普通用戶來說,睡覺的時候可以選擇關機或者開啟飛行模式;另外開通 VoLTE ,可以讓電話和短信都是走 4G 通道,不過網絡降級很難防範;或者買個能識別偽基站的手機,不過沒辦法保證百分百能夠識別;或者就只能等著移動運營商關閉2G網絡了。
對於應用系統開發者,應該認識到通信通道的不安全性。必要的時候開啟雙因子驗證,除短信驗證碼外還可以使用短信上行驗證、語音通話傳輸、專用密碼驗證、常用設備綁定、生物特征識別、動態選擇身份驗證方式等等多種二次驗證方法。
假設某些交易服務需要通過短信驗證碼來驗證用戶的身份。如果有攻擊者截獲了交易請求報文,然後多次發送到服務端,服務端僅檢查了驗證碼是否正確,則可能實際發生多次交易。此時攻擊者都不需要解密傳輸內容。
此時應該限制驗證碼只能夠使用壹次,服務端收到交易請求時首先檢查驗證碼,檢查通過後將驗證碼置位或刪除,然後再處理交易,不管交易是否成功,驗證碼都不能再次使用。另外還應該在生成驗證碼時設置壹個較短的有效期,如果用戶沒有實際提交,攻擊者也必須在有效期內才能使用,增加攻擊難度。
當然妳也可以使用更通用的防重放手段,比如每次請求驗證碼都先從後端獲取壹個隨機數,隨機數如果已經使用過則不能再次使用,隨機數如果不存在也不能處理請求。當然隨機數也可以在前端生成,服務端如果收到了重復的隨機數則拒絕請求,但是需要防止傳輸過程中隨機數不被篡改,可以通過密鑰簽名的方式。