身邊的高科技如果你習以為常了,你就會覺得理所應當,但是如果有人深究起來,問你這高科技裡面到底是什麼原理,大部分人還真答不上來,就像支付寶離線付款技術。
最近和同事閒聊,聊到了支付寶離線付款的問題,同事顯然對這項技術顯得有點不可理解,他的疑問我總結起來主要是這個:
手機離線時也可以生成付款碼,且1分鐘刷新一次。既然支付寶能驗證這些實時刷新的付款碼是否合法,就說明這些不斷刷新生成的付款碼裡肯定有某種支付寶知道的規律(只是這規律外人不知)。
既然有規律,那應該就可以技術破解,為什麼到現在為止還沒聽到有人破解過付款碼?難道真是阿里巴巴的技術太厲害?
筆者不是支付寶的工作人員,更不是數學或者計算機領域的專家,講不出那麼多高深莫測的專業知識,對這方面知識只是“略懂...略懂...”。但這也正是筆者的優勢所在啊,正因為“略懂”,才使得筆者只能用一種平易近人通俗易懂的語言給大家解釋這種科技。
付款碼裡到底有什麼信息
筆者試圖截一個支付寶的付款碼的圖,發現支付寶提示“無法抓取截圖”,可能是為了安全考慮特意禁止。筆者就只好截了一個微信付款碼的圖(和支付寶付款碼的原理是一樣的),大家用掃碼工具掃一下就會發現,
它其實就是一串很長的數字,大概1分鐘就變化一次。我們把離線付款的過程仔細的回想一下:商家在收款系統裡設置好金額——我們打開支付寶——出示付款碼——商家掃碼——過了幾秒鐘商家收到信息“付款成功”。這整個過程用戶都沒有輸入過付款金額。既然沒有付款信息,那付款碼裡應該就只有用戶的賬號信息了。
付款碼如何才能將用戶賬號信息隱藏在一個隨時間變化的數字串中
付款碼裡只有用戶的賬號信息,但是用戶的賬號信息應該固定的,然而二維碼裡隱藏的數字卻是隨時間變化的。那該如何做到這一點呢?
這一點也很簡單啊,用我們固定的賬號信息去和一個隨時間變化的數字序列做運算就行了。筆者這裡做了一個簡單的用戶信息加密方案:
1、我們的賬戶信息就是“123”,支付寶服務器需要的就是這個信息。
2、用戶在當初剛在手機上裝支付寶APP的時候就和支付寶的服務器約定了數字序列 規則:2018.12.28.12.01分的時候數字序列的值為1,每過1秒數字序列的值加2.........
3、那我們的賬戶信息“123”來乘以當前時間數字序列的值,得到一個隨時間變化的包含賬戶信息的數字串,用這個數字串做個二維碼,就成了“付款碼”。
4、支付寶服務器通過商家的網絡得到了用戶的二維碼信息,那它只用那二維碼裡的數字串和當前時間數字序列的值作個反向運算就得到用戶的賬戶信息啦。
這個付款碼隱藏用戶信息的方法似乎太過低劣了,規律太容易找,隨便就能被人破解。但是這就是支付寶付款碼的秘密,就是這麼簡單。
下面的問題就是找一個更好的數字序列來和用戶的賬號信息作運算,這個數字序列應該有一個公式可循,數字序列裡數字又似乎是隨機的、找不到任何規律,這樣才能真正的隱藏用戶的賬號信息。
一個很牛❌的數字序列
數學上還真存在這樣一個數字序列,它就有三個優點,恰好是離線支付所需要的三個條件:
1、這個數字序列有一個公式,約定一個初始值和一個開始時間,通過公示就得得到任意時間點的值。
2、這個數字序列裡的那些數字根本沒規律可循,看起來就像是隨機的。
3、在相同的公式下,用不同的初始值,得到的數字序列根本不存在平移關係。
第三點怎麼理解呢,假設公式很簡單,初始值是1每次加2,得到的數字序列就是 1、3、5、7;如果初始值為2每次加2,得到的序列就是2、4、6、8。兩個序列之間就是有平移關係的。
筆者在讀書的研究過一個叫做“混沌映射”的數字序列,它就是一個這樣的牛❌的數字序列。你不用懂這些複雜的數字序列是怎麼來的,只需要知道有這麼個數字序列並且有三個優點就行了。
這樣得到的付款碼能被技術破解嗎?
筆者很直接的告訴你,幾乎不能破解。付款碼的保密性就是依賴於這個牛❌的數字序列,只要在安裝支付寶APP時和支付寶服務器約定的初始值不洩露,那就根本不可能破解這個數字序列。
如果是用1、3、5、7這樣的數字序列來隱藏賬戶信息,那接下來的值很容易就破解了,那就是9。
但是本文中介紹的那種牛❌數字序列是不可能破解的,即使知道公式和後面某幾個時間上的值,你也得不到後面將會出現的數值。
完畢,其實這個技術現在應用相當廣泛了,之前銀行網銀所用的電子口令就是這麼個原理。
除非有人盜取了你的支付寶賬號,或者用攝像頭偷窺了你的付款碼並立即盜刷,否則用純技術手段幾乎是不可能破解的。
閱讀更多 寶樂科技 的文章