當前位置:首頁 > 公眾號精選 > 架構師社區(qū)
[導讀]菜菜哥,請教個問題唄? 說說看,能否解決不敢保證哦 最近做的App業(yè)務中,有很多敏感操作需要用戶輸入手機驗證碼 這沒問題,手機驗證碼主要是為了驗證當前操作人的有效性,有什么問題呢? 如果有數的幾個操作還可以,但是系統(tǒng)有很多敏感操作,已經有用戶反饋

程序員過關斬將--從用戶輸入手機驗證碼開始

菜菜哥,請教個問題唄?

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

說說看,能否解決不敢保證哦

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

最近做的App業(yè)務中,有很多敏感操作需要用戶輸入手機驗證碼

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

這沒問題,手機驗證碼主要是為了驗證當前操作人的有效性,有什么問題呢?

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

如果有數的幾個操作還可以,但是系統(tǒng)有很多敏感操作,已經有用戶反饋太麻煩了

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

敏感操作驗證用戶的有效性是肯定要加的,那你想怎么做呢?

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

我也不知道,所以才想請教你哦

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

這個嘛

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

驗證用戶的有效性或者安全性,是每個系統(tǒng)必備的安全措施,在移動端優(yōu)先的時代,利用手機驗證碼來驗證用戶,算是安全系數比較高的手段。放眼當下幾乎所有的互聯網應用幾乎都開放了手機驗證碼登錄,而且應用內的敏感操作都需要手機驗證碼或者指紋,甚至面部識別來確定當前操作人的權限。

拋開其他端,單就移動端App方式而言,如果用戶頻繁進行敏感操作,需要頻繁發(fā)送驗證碼,其實在用戶體驗上并不友好,況且短信費用也隨之增加。就App形式而言,驗證一個用戶的有效性其實可以演變?yōu)轵炞C設備的有效性,即:當前人在當前設備上是否可信。

確實是這樣,利用驗證碼方式最終目的也是驗證的這個設備的安全性

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

所以如果有辦法驗證設備的安全性,就沒有必要讓同一個用戶在同一個設備上頻繁輸入憑證了

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

那有什么辦法呢?

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

用戶設備的安全,首先得有設備標示才行,如果拋開web應用,單就App來說,這個很容易,只是客戶端一個設備號而已。而且我們這里討論的也是非Web的環(huán)境。

程序員過關斬將--從用戶輸入手機驗證碼開始
程序員過關斬將--從用戶輸入手機驗證碼開始

以下討論只針對非Web(瀏覽器)環(huán)境,Web環(huán)境其實也可以根據瀏覽器的信息來生成一個類似設備標示的代碼

程序員過關斬將--從用戶輸入手機驗證碼開始


程序員過關斬將--從用戶輸入手機驗證碼開始

很多系統(tǒng)在設計之初,就已經考慮到安全主設備的概念,就像微信,如果在同一個手機上打開是不需要每次都進行登錄操作的。進行設備驗證是每個安全系統(tǒng)比較重要的部分,推薦在系統(tǒng)設計之初就要考慮。回歸正題,對于很多行業(yè)來說,用戶在App內頻繁進行一些敏感操作是很正常的,比如我所在的在線教育行業(yè),老師會很頻繁的在一個班級內添加學生和老師(我們認為這些操作屬于敏感操作)。如果每次都需要老師發(fā)送驗證碼來進行操作,那交互上真的是太不友好。要想保證業(yè)務操作的安全性以及改善交互操作,我們就需要抽象出問題的根本所在。


發(fā)送驗證碼操作最終的目的是為了驗證操作人是操作人,聽起來很繞是不是。實現這個最終目的,其實有很多解決方案,其中用戶可信設備就屬于其中一類,而手機驗證碼方式又是用戶可信設備實現的一種方式,具體來說有幾點:

1. 用戶利用手機驗證碼在這個設備上進行過敏感操作,就認為這個設備在一段時間內是可信任的。

2. 用戶在可信任的設備上進行其他敏感操作,如果在有效期內,就可以做到不發(fā)送驗證碼

3. 用戶的敏感操作也可以進行分級,最高敏感級必須輸入驗證碼才可以進行操作(比如重置密碼,驗證碼登陸),一般敏感級在可信設備有效期內可以不輸入驗證碼。


程序員過關斬將--從用戶輸入手機驗證碼開始

基于以上所說,系統(tǒng)設計的時候就可以抽象出一個用戶可信設備中心,包括敏感操作的定義,可信設備的有效時長,可信設備的定義(比如:驗證碼通過的設備可定義為有效設備)等等概念。通過這樣設計,短信驗證只不過成為驗證用戶信任設備的一種途經,完全可以做到和具體業(yè)務無關(敏感級別最高操作除外),一般敏感的操作業(yè)務接口也可以避免添加驗證碼參數,真正的把驗證和業(yè)務相分離,豈不美哉?


經過這樣抽象,用戶可信設備中心其實本質的接口只有幾個:

1. 驗證設備是否有效

2. 設置設備有效

3. 設備有效的途經(例如短信驗證碼方式)


當然你的系統(tǒng)首先要有設備的概念,如果非要寫幾行代碼的話

1. 驗證設備有效

public async Task<intCheckUserDevice(UserDeviceReq para)
        
{

            if (para == null || string.IsNullOrWhiteSpace(para.DeviceName) || para.UserId <= 0)
            {
                return 0;
            }
            //檢查簽名
            var sign = EncrypHelper.MD5Encrypt($"{SysConfig.SecretKey}_{para.UserId}_{para.DeviceName}");
            if (sign != para.Sign)
            {
                return 0;
            }
            string key = $"{para.UserId}_{para.DeviceName}";
            var authRet = await RedisClient.GetString(key);
            if (string.IsNullOrWhiteSpace(authRet))
            {
                //告訴客戶端需要短信驗證碼
                return 414000;
            }
            return 1;
        }


2. 設置設備有效

public async Task<intSetUserDevice(UserDeviceReq para)
        
{

            if (para == null || string.IsNullOrWhiteSpace(para.DeviceName) || para.UserId <= 0)
            {
                return 0;
            }
            //檢查簽名
            var sign = EncrypHelper.MD5Encrypt($"{SysConfig.SecretKey}_{para.UserId}_{para.DeviceName}");
            if (sign != para.Sign)
            {
                return 0;
            }
            string key = $"{para.UserId}_{para.DeviceName}";
            var cacheRet = await RedisClient.GetString(key);
            if (string.IsNullOrWhiteSpace(cacheRet))
            {
                UserDeviceInfo value = new UserDeviceInfo() { UserId = para.UserId, DeviceName = para.DeviceName, OperationCode = para.OperationCode, CreateDate = DateTime.Now, Context = "" };
                var userDeviceExp = SysConfig.GetAppSetting("Config:UserDeviceExpire");
                if (string.IsNullOrWhiteSpace(userDeviceExp))
                {
                    userDeviceExp = "300";
                }
                var authRet = await RedisClient.SetString(key, JsonConvert.SerializeObject(value), TimeSpan.FromMinutes(int.Parse(userDeviceExp)));
                if (!authRet)
                {
                    return 0;
                }
            }
            return 1;
        }


特別推薦一個分享架構+算法的優(yōu)質內容,還沒關注的小伙伴,可以長按關注一下:

程序員過關斬將--從用戶輸入手機驗證碼開始

長按訂閱更多精彩▼

程序員過關斬將--從用戶輸入手機驗證碼開始

如有收獲,點個在看,誠摯感謝

免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉