序言
作為一個(gè)軟件開(kāi)發(fā)者兰英,提高軟件的安全性是每個(gè)人都需要關(guān)注的叙凡。安全性涉及的面很廣正驻,比如Apk包是否做了代碼混淆(提高反編譯難度)厌蔽,數(shù)據(jù)傳輸過(guò)程是否安全牵辣,數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)是否安全等。
今天奴饮,我們來(lái)探討一下App登錄模塊密碼傳輸?shù)陌踩浴?/p>
可行方案
先給出一個(gè)比較可行的方案纬向,后面會(huì)分析安全性是怎么體現(xiàn)的。
- 用戶(hù)注冊(cè)過(guò)程戴卜,客戶(hù)端通過(guò)
rule1(pass)
得到一個(gè)編碼后的密碼串passStr
逾条,然后調(diào)用注冊(cè)接口把name/passStr
傳給服務(wù)器保存(不能用明文密碼傳輸保存) - 用戶(hù)在登錄頁(yè)面填寫(xiě)了用戶(hù)
name
和密碼pass
后,點(diǎn)擊登錄按鈕叉瘩,客戶(hù)端通過(guò)rule1(pass)
把明文密碼轉(zhuǎn)換為passStr
- 客戶(hù)端發(fā)送請(qǐng)從服務(wù)器查詢(xún)一個(gè)時(shí)間戳
ts
和隨機(jī)鹽salt
- 客戶(hù)端按照一定規(guī)則
rule2(pass, salt)
生成一個(gè)加密字符串encryptStr1
膳帕,調(diào)用登錄接口粘捎,把name/encryptStr1/ts
傳給服務(wù)端 - 服務(wù)器接收到請(qǐng)求薇缅,根據(jù)
name
獲取passStr/salt
,然后按照同樣的規(guī)則rule2(pass, salt)
得到密碼串encrptStr2
- 然后用
encryptStr2
與客戶(hù)端傳來(lái)的encryptStr1
進(jìn)行比對(duì)攒磨,如果兩者相同泳桦,則登錄成功,返回一個(gè)會(huì)話給客戶(hù)端娩缰。
上面的步驟中有些地方需要做一些說(shuō)明:
- 服務(wù)端不能存儲(chǔ)明文密碼灸撰,但可以存儲(chǔ)一個(gè)編碼后的密文
passStr
,這個(gè)密文在用戶(hù)注冊(cè)的過(guò)程中客戶(hù)端生成(根據(jù)用戶(hù)輸入的密碼pass
按一定的規(guī)則rule1
生成)拼坎,通過(guò)注冊(cè)接口傳給服務(wù)端浮毯,服務(wù)端保存在用戶(hù)表中。 -
salt
應(yīng)該具有時(shí)效性泰鸡,可以設(shè)置一個(gè)比較短的有效期(如1分鐘)债蓝,一旦超過(guò)這個(gè)時(shí)間,salt
失效盛龄,通過(guò)salt
生成的加密串也驗(yàn)證不通過(guò)饰迹。
這么說(shuō)可能不夠形象,下面我用一張圖來(lái)表示:
模擬盜取用戶(hù)信息登錄
針對(duì)上面提出的登錄加密方案余舶,我們考慮一下如何能夠盜取用戶(hù)的登錄信息啊鸭。
- 首先,我要說(shuō)的是Https請(qǐng)求可以通過(guò)抓包工具獲取通信內(nèi)容匿值,所以?xún)H僅通過(guò)Https來(lái)保證安全是不可靠的
- 在手機(jī)中植入病毒赠制,獲取用戶(hù)的輸入行為,這種方式毫無(wú)疑問(wèn)可以直接拿到用戶(hù)的用戶(hù)名跟密碼挟憔,直接冒充用戶(hù)身份登錄
- 攔截用戶(hù)的注冊(cè)請(qǐng)求獲取
passStr
憎妙,不過(guò)用戶(hù)注冊(cè)的行為是一次性的库正,所以不那么好攔截,我們就認(rèn)為無(wú)法獲取passStr - 攔截獲取隨機(jī)鹽接口厘唾,那么攻擊者就可以修改參數(shù)獲取用戶(hù)的隨機(jī)鹽
- 攔截登錄接口褥符,攻擊者可以獲取當(dāng)次請(qǐng)求的
encryptStr1/name/ts
,用這些參數(shù)可以在salt有效期內(nèi)冒充用戶(hù)進(jìn)行登錄 - 攻擊者反編譯Apk抚垃,獲取
rule1
和rule2
茉兰,但攻擊者還是無(wú)法推算出passStr夜赵,所以還是無(wú)法冒充用戶(hù)身份進(jìn)行登錄
綜上所述,攻擊者可以做的事情如下:
- 往用戶(hù)手機(jī)中植入惡意病毒,監(jiān)聽(tīng)用戶(hù)輸入操作歇万,獲取用戶(hù)名密碼,可冒充用戶(hù)登錄
- 攔截用戶(hù)注冊(cè)請(qǐng)求乾吻,獲取
passStr
燃观,攔截獲取隨機(jī)鹽請(qǐng)求,知道獲取salt
規(guī)則追他,反編譯Apk坟募,獲取rule2
。知道這些信息的情況下邑狸,也可以冒充用戶(hù)進(jìn)行登錄懈糯。但這種方式難度極大,主要存在以下幾個(gè)難點(diǎn):注冊(cè)操作是一次性的单雾,不太可能被攔截赚哗;要抓取Https請(qǐng)求包,需要在用戶(hù)手機(jī)上安裝證書(shū)硅堆,或者讓用戶(hù)在自己安裝證書(shū)的手機(jī)上登錄賬號(hào)屿储;APK會(huì)加入混淆規(guī)則,所以反編譯難度比較高渐逃」宦樱總結(jié)來(lái)說(shuō),這種方式不太可行朴乖。 - 攔截用戶(hù)登錄接口祖屏,獲取此次登錄參數(shù),在salt有效時(shí)間內(nèi)买羞,可以冒充用戶(hù)登錄袁勺,如果用戶(hù)體系存在互踢機(jī)制,那么用戶(hù)會(huì)發(fā)覺(jué)賬號(hào)被踢畜普,及時(shí)修改密碼
總結(jié)
從以上分析可以看出期丰,這種登錄方案還是比較安全可靠的,用戶(hù)密碼和登錄信息不易泄漏。當(dāng)然钝荡,除了這種方式街立,還有很多其他方式也可以保證安全,比如非對(duì)稱(chēng)加密RSA算法埠通,對(duì)稱(chēng)加密算法(用RSA加密秘鑰)等赎离。