手機(jī)驗(yàn)證碼登錄是一種常見的應(yīng)用登錄方式,簡單方便,不用記憶密碼,市面上能見到的App基本都支持這種登錄方式,很多應(yīng)用還把登錄和注冊集成到了一起,注冊+登錄一氣呵成,給用戶省去了很多麻煩,頗有一機(jī)在手、天下我有的感覺。
登錄原理
手機(jī)驗(yàn)證碼登錄的原理很簡單,對于一個正常的登錄流程,看下邊這張圖就夠了:
實(shí)際應(yīng)用中會存在一些收不到驗(yàn)證碼的情況,可能的原因如下:
- 在手機(jī)端,短信被某些軟件認(rèn)為是垃圾信息而被攔截或者刪除,或者因?yàn)槭謾C(jī)卡欠費(fèi)導(dǎo)致收不到短信。
- 在應(yīng)用服務(wù)端,因?yàn)槌绦蝈e誤,或者安全控制策略導(dǎo)致部分短信發(fā)送失敗。
- 在短信平臺或者電信運(yùn)營商系統(tǒng),因?yàn)楹诿麊巍㈥P(guān)鍵字、流量控制,或者其它某些技術(shù)原因?qū)е掳l(fā)送失敗。
針對收不到短信的問題,系統(tǒng)中會增加重發(fā)驗(yàn)證碼功能,如果多次重發(fā)還收不到,系統(tǒng)可以支持上行短信或者語音驗(yàn)證碼的方式,這兩種方式都是短信驗(yàn)證碼的變種。
- 上行短信是讓用戶將系統(tǒng)提前生成好的若干字符發(fā)送到系統(tǒng)指定的短信號碼,據(jù)此可以驗(yàn)證用戶擁有指定手機(jī)的控制權(quán),從而也就認(rèn)證了用戶的身份。
- 語音驗(yàn)證碼可以讓用戶發(fā)起,也可以在系統(tǒng)收到短信發(fā)送未成功的回執(zhí)時主動推送,用戶手機(jī)會收到一個自動語音通話,其中包含登錄所需的驗(yàn)證碼。
安全風(fēng)險(xiǎn)和應(yīng)對策略
手機(jī)驗(yàn)證碼的安全風(fēng)險(xiǎn)主要是被惡意利用和竊取。
因?yàn)槭謾C(jī)驗(yàn)證碼的應(yīng)用十分廣泛,為了有一個更全面的認(rèn)識,這里說的安全風(fēng)險(xiǎn)沒有局限在登錄這一點(diǎn)上,所有使用手機(jī)驗(yàn)證碼的場景都可能存在。這里的應(yīng)對策略主要是站在系統(tǒng)開發(fā)者的角度,通過各種技術(shù)方案來解決或者降低手機(jī)驗(yàn)證碼的安全風(fēng)險(xiǎn)。
短信詐騙
詐騙者先獲取到用戶手機(jī)號,然后冒充金融機(jī)構(gòu)、公權(quán)力部門、親朋好友,在應(yīng)用中輸入用戶手機(jī)號請求驗(yàn)證碼后,向用戶索要對應(yīng)的手機(jī)驗(yàn)證碼,用戶稍不注意可能就會造成金錢損失。
針對此類問題,系統(tǒng)開發(fā)者可以考慮如下一些方案:
- 在驗(yàn)證碼中聲明:工作人員不會索取,打死也不要泄露給別人。不過人在一些特殊情況下是不會理會這些警告的。
- 跟蹤用戶的常用登錄特征,比如獲取驗(yàn)證碼時的設(shè)備、IP、WIFI、地域不是常用的,系統(tǒng)就可以馬上短信或者語音通知用戶可能存在安全風(fēng)險(xiǎn),請謹(jǐn)慎操作;系統(tǒng)還可以直接升級安全級別要求更多的驗(yàn)證方式,比如需要再次獲取驗(yàn)證碼、輸入安全碼、刷取指紋、識別人臉、插入U(xiǎn)盾等等驗(yàn)證方式。
還有一種相對隱蔽的詐騙方式,詐騙者直接向用戶發(fā)送仿冒釣魚網(wǎng)站的地址,用戶在釣魚網(wǎng)站獲取驗(yàn)證碼時,詐騙者拿著用戶手機(jī)號去真實(shí)網(wǎng)站請求驗(yàn)證碼,此時用戶會收到一個真實(shí)的驗(yàn)證碼,用戶在釣魚網(wǎng)站輸入驗(yàn)證碼后,詐騙者就可以拿著這個驗(yàn)證碼去真實(shí)網(wǎng)站使用。
針對這種情況,前邊的識別用戶常用登錄特征的方式仍然有效。此外短信平臺和電信運(yùn)營商也有責(zé)任對短信內(nèi)容進(jìn)行把關(guān),短信平臺需要驗(yàn)證發(fā)送者的真實(shí)身份、審核短信內(nèi)容,并提供動態(tài)的流量控制機(jī)制,這樣可以過濾掉絕大部分詐騙短信。
其實(shí)電信運(yùn)營商是能夠識別手機(jī)位置的,如果電信運(yùn)營商能夠提供一種安全的位置認(rèn)證服務(wù),也可以解決大部分驗(yàn)證碼詐騙問題,比如前端提交驗(yàn)證碼認(rèn)證時攜帶電信運(yùn)營商提供的位置標(biāo)識,應(yīng)用服務(wù)商可以拿著這個位置標(biāo)識去找電信運(yùn)營商驗(yàn)證位置,當(dāng)然這只是一個設(shè)想,現(xiàn)實(shí)中還沒有這種方法。
短信攻擊
可能有兩種場景下的短信攻擊:
- 用戶在前端不停地點(diǎn)擊獲取驗(yàn)證碼,可能是擔(dān)心收不到驗(yàn)證碼,也可能是失去了等待的耐心,也可能是惡意向別的手機(jī)號發(fā)送。
- 攻擊者直接調(diào)用發(fā)送驗(yàn)證碼的接口,在極端的時間發(fā)送大量驗(yàn)證碼請求,可能是發(fā)給某個用戶也可能是一批用戶。
此類操作首先會浪費(fèi)短信資源,給應(yīng)用服務(wù)商造成損失;惡意攻擊還會向無辜的用戶發(fā)送大量短信,造成騷擾攻擊。
應(yīng)對這種問題,可以考慮如下一些方案:
- 增加其它驗(yàn)證。 獲取短信驗(yàn)證碼之前必須先通過這些驗(yàn)證,比如圖形驗(yàn)證碼、滑動驗(yàn)證碼、數(shù)學(xué)公式驗(yàn)證碼等等。這些方式可以增加發(fā)送短信驗(yàn)證碼的難度,降低人工的發(fā)送速度,盡量避免機(jī)器人自動操作。
- 對操作進(jìn)行限流。 比如現(xiàn)在前端常見的發(fā)送短信驗(yàn)證碼倒計(jì)時,一般每次請求驗(yàn)證碼后經(jīng)過若干秒才能再次發(fā)送。因?yàn)槿绻粽攉@取到了發(fā)送驗(yàn)證碼的服務(wù)接口,就可以擺脫前端邏輯的限制,所以后端也可以采用同樣的策略,對設(shè)備Id、手機(jī)號、IP、用戶、業(yè)務(wù)類型等等,以及它們的各種組合,進(jìn)行頻率控制。應(yīng)用開發(fā)者還可以根據(jù)發(fā)送結(jié)果特征來進(jìn)行控制,比如空號率,如果空號太多則說明可能是機(jī)器人隨機(jī)生成的手機(jī)號。在單一頻率的限制基礎(chǔ)之上,還可以增加更多的時間控制,在分鐘、小時、天等時間維度上做不同的閾值限制。
- 給用戶提供一個短信退訂入口。 用戶頻繁收到非自己主動發(fā)起的驗(yàn)證碼短信時,可以提供一個退訂入口,讓用戶在短時間內(nèi)關(guān)閉短信驗(yàn)證碼,應(yīng)用服務(wù)此時可以忽略給用戶發(fā)送驗(yàn)證碼的請求,或者直接去掉發(fā)送驗(yàn)證碼的功能入口。
但是這種控制要盡量以不影響用戶的正常業(yè)務(wù)操作為前提,否則就得不償失了。
- 比如圖形驗(yàn)證碼的難度不要太高,畢竟大部分業(yè)務(wù)不是12306,你照搬過來可能就會弄巧成拙。
- 再比如對于限流控制,假設(shè)正常用戶一般只在一天的某些時候進(jìn)行操作,不會一天24小時都在做某一件事,則可以這樣做:每個手機(jī)號每小時只能發(fā)送X次,每天只能發(fā)送Y次,這兩個數(shù)值要符合 X>Y。
- 對于嚴(yán)重的攻擊,應(yīng)該設(shè)置熔斷機(jī)制,此時不得不犧牲可用性。比如短時間涌入了大量針對不同手機(jī)號的驗(yàn)證碼需求,很可能是受到了DDoS攻擊,因?yàn)橘Y源有限,此時正常用戶的操作也會受到影響,可以依托全局限流,觸發(fā)限流時直接關(guān)閉驗(yàn)證碼服務(wù)一段時間。
網(wǎng)絡(luò)竊聽
假設(shè)用戶收到了登錄驗(yàn)證碼,輸入正確后提交服務(wù)端驗(yàn)證。在從手機(jī)端到服務(wù)端的傳輸過程中,會經(jīng)過很多的網(wǎng)絡(luò)設(shè)備和服務(wù)器系統(tǒng),登錄提交的內(nèi)容有被攔截獲取的可能,此時攻擊者就可以阻斷請求,自己拿著用戶的手機(jī)號和驗(yàn)證碼去登錄。
應(yīng)對這種問題,一般需要對網(wǎng)絡(luò)傳輸內(nèi)容進(jìn)行加密,比如現(xiàn)在常用的https通信,可以保證兩端之間的傳輸內(nèi)容安全,不被竊聽。對于傳輸安全,一般這樣處理也就夠了。
不過https也不是銀彈,如果有攻擊者在客戶端偷偷導(dǎo)入了自己的證書,然后讓網(wǎng)絡(luò)請求都先通過自己進(jìn)行代理,再發(fā)送到目標(biāo)地址,則攻擊者還是能夠獲取到請求內(nèi)容,想體驗(yàn)這種方式的可以使用fiddler試試。還有https證書存在錯發(fā)的可能,如果給攻擊者發(fā)放了別人的證書,此時安全傳輸也就沒什么意義了。
為了更高的安全性,傳輸內(nèi)容可以在應(yīng)用中加解密,客戶端對要傳輸?shù)臄?shù)據(jù)按照與服務(wù)端的約定進(jìn)行加密,然后再發(fā)送到網(wǎng)絡(luò),攻擊者截獲后,如果沒有有效的解密手段,則可以保證數(shù)據(jù)不被竊聽。加密的重點(diǎn)是保證密鑰安全,不被竊取和替換,可以采用其它安全信道傳輸,甚至線下傳遞的方式。對于驗(yàn)證碼這種僅做驗(yàn)證的數(shù)據(jù),還可以通過加鹽后進(jìn)行慢Hash運(yùn)算,攻擊者即使拿到了傳輸內(nèi)容,要進(jìn)行破解的難度也相當(dāng)巨大。
本地竊聽
如果系統(tǒng)上安裝了惡意軟件或者非官方版本的軟件,特別是在盜版系統(tǒng)、被Root或者越獄的手機(jī)系統(tǒng)中,攻擊者也能比較容易的攔截并竊取短信驗(yàn)證碼;同時網(wǎng)絡(luò)竊聽中的加解密也可能失去作用,因?yàn)檐浖呀?jīng)不可信,在不同的操作之間有沒有發(fā)生什么貓膩,很難確定。
最近幾年在移動設(shè)備上引入了一個稱為可信執(zhí)行環(huán)境(簡稱TEE)的概念,獨(dú)立于操作系統(tǒng),單獨(dú)的應(yīng)用,單獨(dú)運(yùn)行,有的甚至有單獨(dú)的處理器和存儲,外部很難進(jìn)入和破解。一些關(guān)鍵的操作都封裝在這里邊,比如指紋的采集、注冊和認(rèn)證,密鑰的生成和使用,版權(quán)視頻的解碼和顯示,等等。如果把短信驗(yàn)證碼的處理也放在這里邊,無疑會安全很多,不過這要解決很多通信方面的問題,收益與成本可能不成正比。在臺式機(jī)中這一技術(shù)還所見不多,可能臺式機(jī)的環(huán)境已經(jīng)有了比較成熟的安全體系,不過從移動端遷移過來的難度應(yīng)該也不大。
短信嗅探
短信嗅探也是一種竊聽技術(shù),不過是通過攻擊電信網(wǎng)絡(luò)通信的方式。
現(xiàn)在手機(jī)一般都使用4G、5G網(wǎng)絡(luò)了,但是“短信嗅探”技術(shù)只針對2G網(wǎng)絡(luò),不法分子通過特殊設(shè)備壓制基站信號,或者選擇網(wǎng)絡(luò)質(zhì)量不佳的地方,或者使用4G偽基站欺騙手機(jī),這會導(dǎo)致網(wǎng)絡(luò)降頻,使手機(jī)的3G、4G通信降低到2G。
2G網(wǎng)絡(luò)下,只有基站驗(yàn)證手機(jī),手機(jī)不能驗(yàn)證基站,攻擊者通過架設(shè)偽基站,讓目標(biāo)手機(jī)連接上來,然后就能獲取一些連接鑒權(quán)信息,再冒充目標(biāo)手機(jī)去連接真基站,連上以后撥打攻擊者的另一個手機(jī),通過來電顯示得到目標(biāo)手機(jī)號碼。
基站本身并不會用特定方向的信號與每部手機(jī)通信,而是向四周以廣播的形式發(fā)送信號。所以每部手機(jī)實(shí)際上也是可以接收到其他手機(jī)的信號,2G網(wǎng)絡(luò)傳輸數(shù)據(jù)時沒有加密,短信內(nèi)容是明文傳輸?shù)模涂梢孕崽降侥繕?biāo)手機(jī)的短信。加之2G通訊協(xié)議是開源的,所以這件事的技術(shù)門檻并不高。
因?yàn)檫@種攻擊要求手機(jī)不能移動,如果基站切換就沒用了,所以攻擊一般選擇夜深人靜的時候。對于普通用戶來說,睡覺的時候可以選擇關(guān)機(jī)或者開啟飛行模式;另外開通 VoLTE ,可以讓電話和短信都是走 4G 通道,不過網(wǎng)絡(luò)降級很難防范;或者買個能識別偽基站的手機(jī),不過沒辦法保證百分百能夠識別;或者就只能等著移動運(yùn)營商關(guān)閉2G網(wǎng)絡(luò)了。
對于應(yīng)用系統(tǒng)開發(fā)者,應(yīng)該認(rèn)識到通信通道的不安全性。必要的時候開啟雙因子驗(yàn)證,除短信驗(yàn)證碼外還可以使用短信上行驗(yàn)證、語音通話傳輸、專用密碼驗(yàn)證、常用設(shè)備綁定、生物特征識別、動態(tài)選擇身份驗(yàn)證方式等等多種二次驗(yàn)證方法。
重放攻擊
假設(shè)某些交易服務(wù)需要通過短信驗(yàn)證碼來驗(yàn)證用戶的身份。如果有攻擊者截獲了交易請求報(bào)文,然后多次發(fā)送到服務(wù)端,服務(wù)端僅檢查了驗(yàn)證碼是否正確,則可能實(shí)際發(fā)生多次交易。此時攻擊者都不需要解密傳輸內(nèi)容。
此時應(yīng)該限制驗(yàn)證碼只能夠使用一次,服務(wù)端收到交易請求時首先檢查驗(yàn)證碼,檢查通過后將驗(yàn)證碼置位或刪除,然后再處理交易,不管交易是否成功,驗(yàn)證碼都不能再次使用。另外還應(yīng)該在生成驗(yàn)證碼時設(shè)置一個較短的有效期,如果用戶沒有實(shí)際提交,攻擊者也必須在有效期內(nèi)才能使用,增加攻擊難度。
當(dāng)然你也可以使用更通用的防重放手段,比如每次請求驗(yàn)證碼都先從后端獲取一個隨機(jī)數(shù),隨機(jī)數(shù)如果已經(jīng)使用過則不能再次使用,隨機(jī)數(shù)如果不存在也不能處理請求。當(dāng)然隨機(jī)數(shù)也可以在前端生成,服務(wù)端如果收到了重復(fù)的隨機(jī)數(shù)則拒絕請求,但是需要防止傳輸過程中隨機(jī)數(shù)不被篡改,可以通過密鑰簽名的方式。