手機號碼一鍵登入是最近兩三年出現的一種新型應用登入方式,比之前常用的簡訊驗證碼登入又方便了不少。登陸時,應用首先向使用者展示帶有本機號碼掩碼的授權登入頁面,使用者點選“同意授權”的按鈕之後,應用即可獲取到完整的本機號碼,從而完成使用者的登入認證。在這個過程中,應用只要確認登入用的手機號碼是在繫結了此號碼的手機上發起的即可認證成功,從這一點來看,它和簡訊驗證碼登入並無本質區別,都是一種裝置認證登入方式。這篇文章就來捋一下其中的技術門道。
這幾年為了保護使用者的隱私安全,Android和iOS系統都限制了應用獲取本機號碼的能力,即使通過某些技術手段獲取到了本機號碼,這個號碼還可能是被篡改的,所以應用直接讀取本機號碼用於登入是不可行的。那麼這些應用是怎麼獲取到真實的本機號碼的呢?答案是電信運營商,手機要打電話、要上網、要計費,運營商肯定能對應到正確的手機號碼。國內的運營商就是移動、聯通、電信這三家,它們都開放了這種能力。對於在網際網路大潮中被管道化的運營商來說,不失為一種十分有意義的積極進取。
手機流量上網的原理
手機號碼一鍵登入是藉助手機流量上網來實現,所以先要搞清楚流量上網的原理。
目前網上已有很多關於一鍵登入的技術文章,但是內容基本雷同,關於獲取手機號碼的部分,所述都是通過運營商的資料閘道器能力,語焉不詳,對於有追求的技術人來說,難以忍受。這個章節就來介紹下這種從資料閘道器獲取手機號碼的能力是如何實現的,因為通訊專業知識十分繁雜,我也沒有經過專業的學習,大家也不想接觸到很多的專業名詞,所以這裡只保留一些關鍵的專業名詞,儘量以通俗易懂的方式來理清這個機制。
五層網路模型
對網路比較熟悉的同學,應該瞭解五層協議,那麼手機流量上網時的五層網路模型有何不同呢?
從上圖可以看出,手機流量上網的主要區別在資料鏈路層和物理層。在資料鏈路層,流量上網沒有MAC地址的概念,它採用一種點對點協議(PPP),手機端通過撥號方式建立這種PPP連線,然後傳送資料。在物理層,流量上網通過手機內建的基帶模組進行無線訊號的調製、解調工作,從而實現與移動基站之間的電磁波通訊。
流量上網的機制
點對點協議支援身份驗證功能,手機端發起連線時會攜帶自己的身份證明,一般就是手機卡內建的IMSI,這個IMSI也會儲存在運營商的資料庫中,因此基站就可以驗證連線使用者的身份,當然這個驗證過程不是簡單的對比IMSI,會有更多安全機制。為了更清楚的瞭解流量上網機制,下面再來一張4G流量上網時手機與運營商的互動示意圖:
核心元件
手機:這其中對流量上網起到關鍵作用的就是手機卡和基帶模組。手機卡中儲存了IMSI,全稱International Mobile Subscriber Identification Number,國際移動使用者識別碼。IMSI是手機卡的身份標識。
基站:就是外邊常見的鐵架子訊號塔,是一種能覆蓋一定範圍的無線電收發資訊電臺,手機會連線到它,然後它再通過光纖連線到運營商網路,從而實現行動通訊。
MME:Mobility Management Entity,移動控制單元。手機建立連線時會先訪問到這裡,負責:手機與基站的接入控制,手機卡的鑑權、會話管理、安全傳輸,漫遊控制、跨運營商通訊等。
HSS:Home Subscriber Server,歸屬簽約使用者伺服器。儲存本地簽約的手機卡資訊,包括手機卡IMSI與手機號的對應關係,手機號的套餐資訊、手機號的歸屬地資訊等。
S-GW:Service Gateway,服務閘道器。4G環境下,使用者側與運營商核心網之間的業務閘道器。訪問能不能進入,能做什麼業務,去哪裡做業務,是在這裡控制的。跨運營商計費、漫遊計費等也在這裡完成。
P-GW:PDN Gateway,PDN閘道器。運營商核心網與網際網路之間的閘道器,手機真正上網就是通過它了。它會給手機分配一個IP地址,控制上網的速度,對流量進行計費等。
PCRF:Policy and Charging Rules Function,策略與計費控制單元,儲存每個使用者的網路訪問策略和計費規則。
上網過程
為了方便理解,這裡將上網的過程大致分為兩個部分(和上圖的1、2對應):
-
1 接入:建立連線時,手機攜帶IMSI資訊,通過基站訪問到MME,MME通過HSS驗證IMSI資訊,然後MME進行一些初始化工作,返回一些鑑權引數給手機,手機再進行一些計算,然後把計算結果返回給MME,MME驗證手機的計算結果,驗證通過則允許接入。這個過程保證了接入的安全,MME還為後續的資料傳輸提供了加密傳輸支援,保護資料不被竊聽和篡改,有興趣的同學可以去詳細瞭解下。
如果手機卡銷售的時候沒有寫入手機號,手機卡首次註冊登記的時候,運營商會從HSS中取出手機號,然後再寫入手機卡中。
實際應用中,為了防止跟蹤和攻擊,不是每次通訊時都要攜帶IMSI,MME會生成一個臨時的GUTI對應到IMSI,就像Web程式中的SessionId。MME還有一定的機制控制GUIT的重新分配。
-
2 傳輸:手機網路流量的傳輸,還是先要通過基站,然後下一步進入S-GW,S-GW會檢查使用者的授權,就像Web程式中檢查前端提交過來的SessionId,再看看使用者有沒有許可權進行其提交的業務,這裡就是看看使用者有沒有開通流量上網,這是S-GW通過連線MME實現的。S-GW處理完畢後,資料包會進入P-GW,P-GW在手機使用流量上網時會給使用者分配一個IP地址,然後資料包通過閘道器進入網際網路,訪問到相關的資源。P-GW還會對上網行為進行速率控制、流量計費等操作,這些策略來源於PCRF,PCRF中的規則是根據HSS中的使用者套餐、使用者等級等計算出來的。
對P-GW來說S-GW遮蔽了使用者的移動性,手機在多個基站切換時,S-GW不變。
以上就是手機流量上網的基本原理了,可以看到,運營商通過IMSI或者GUTI完全有能力獲取到當前上網使用者的手機號碼。對於運營商的一鍵登入具體是怎麼實現的,我並沒有找到相關的介紹,但是可以設想下:手機應用通過運營商的SDK發起獲取手機號碼的業務請求,此時會攜帶IMSI或者GUTI,業務請求到達S-GW,S-GW鑑權通過,然後將這個業務請求路由到運營商核心網中獲取手機號碼的服務,服務根據業務規則從HSS中取出手機號碼並進行若干處理。
一鍵登入的原理
理解了手機流量上網的原理,再來看下一鍵登入業務是如何實現的,這個部分屬於上層應用程式開發,大家應該相對熟悉一些。
如果你接入過微信的第三方應用登入,或者其他類似的第三方應用登入,過程是差不多的。還是先來看圖:
這裡對一些關鍵步驟進行說明:
-
2預取手機號掩碼:這個手機號掩碼需要在請求使用者授權的頁面展示給使用者看,因為獲取這個資訊要通過電信運營商的網路,所以可能會比較慢,為了提升使用者體驗,可以在應用啟動的時候就去獲取,然後快取一段時間。
-
8授權請求:因為應用獲取使用者手機號這個事比較敏感,必須讓使用者清楚的瞭解並授權之後才能進行,為了確保這件事,運營商的認證SDK提供了這個授權請求頁面,使用者確認授權後,SDK直接向運營商認證服務發起請求認證,認證服務會返回一個認證Token給應用。應用再通過自己的服務端拿著這個Token找運營商獲取手機號碼。
-
17生成應用授權Token:應用要維護自己使用者的登入狀態,這裡可以採用傳統的Session機制,也可以使用JWT機制。
-
3預取手機號掩碼 和 11請求認證,都需要通過手機蜂窩網路通訊,也就說需要通過手機流量上網。如果手機同時開啟了流量和WIFI,認證SDK會將手機短暫切換到流量上網模式。如果手機沒有開啟流量,有些SDK還會在上次成功取號之後多快取一個臨時Token,這樣也能成功實現一次一鍵登入,不過這個限制性很大。
這裡其實還有一個安全問題:
14登入請求:使用者如果隨便造一個認證Token,然後就嚮應用服務提交請求,應用服務再向認證服務提交請求,這屬於一種跨站攻擊。雖然這個Token可以被阻止,但是不免浪費資源,給服務端帶來壓力。
這一點微信第三方應用登入做的比較好,使用者登入前,應用服務端先生成一個隨機數,然後應用前端嚮應用服務端提交時,帶著這個隨機數,應用服務端可以驗證這個隨機數。
號碼驗證場景
除了用於登入,運營商閘道器的這種取號能力,還可以用在驗證手機號上,在某些關鍵業務上,比如支付過程中,要求使用者輸入本機手機號碼或者其中的某幾位,然後通過運營商認證服務驗證手機號是否本機號碼。
隱私保護問題
裝置唯一標識問題
現在大家對隱私問題關注的越來越多了,經常會出現這種情況:你在某電商網站搜尋了某個商品,然後訪問其它網站時,都向你推薦這類商品的廣告。還有一種感覺很恐怖的情況,你剛和某個人談論了某件事,然後就在某個App上看到了關於這件事的推薦,有人猜測是App在偷聽,不過基於目前的輿論和監督,偷聽風險太大,這其中的原因可能真的只是演算法太厲害了。
最近幾年Android和iOS系統都對App獲取手機唯一標識進行了限制,比如IMEI、Mac地址、序列號、廣告Id等,目的就是防止使用者的資訊在多個App之間進行關聯,導致洩漏使用者的隱私,產生一些安全問題和法律風險,前述跨App的廣告行為也自然受到了抑制。
在瞭解一鍵登入的技術原理時,看到某運營商提供了一種和SIM卡繫結的裝置唯一Id服務,宣傳語就是為了應對移動作業系統限制訪問手機唯一標識的問題,在現今越來越重視隱私保護的前提下,如果這種能力開放給了廣告平臺,就是開歷史的倒車了。
手機號作為身份標識的問題
對於國內普遍使用手機號登入的方式,從技術上很難限制App之間進行手機號關聯,然後綜合分析使用者的行為。比如某家大廠運營了多款不同種類的熱門App,它就有能力更全面的瞭解某個使用者,如果要限制可能就得通過法律層面來解決了。至於不同廠商之間的手機號關聯行為,基於商業利益的保護,不太可能會出現。
在國內這種商業環境下,如果你真的對自己的隱私很關注,最好只使用賬號密碼的方式登入,否則經常更換手機號可能是一種沒辦法的辦法。
手機號重新銷售問題
手機號的總量是有限的,為了有效利用手機號資源,手機號登出以後,經過一段時間就會被運營商重新銷售。如果新的手機號擁有者拿著這個手機號登入某個APP,而這個手機號之前已經在這個App上註冊過,產生了大量的使用記錄,那麼此手機號前擁有者的隱私就會被洩漏。所以大家現在都不太敢隨便更換手機號,因為註冊過的地方太多了,留下了數不清的使用痕跡。
在瞭解一鍵登入的技術原理時,還看到某運營商提供了一種“手機號更換繫結SIM卡通知”的服務,應用可以據此解綁重新銷售的手機號與應用賬號之間的關係,從而保護使用者的隱私。在上文中已經提過手機卡使用IMSI進行標識,如果手機號被重新銷售,就會繫結新的IMSI,運營商可以據此產生通知。當然運營商還需要排除手機卡更換和攜號轉網的情況,這些情況下手機號也會繫結新的IMSI。
不得不說運營商的這個服務還是挺讚的?。
以上就是本文的主要內容了,因本人才疏學淺,如有錯漏,歡迎指正。
收穫更多架構知識,請關注微信公眾號 螢火架構。原創內容,轉載請註明出處。