根據時間生成手機令牌密碼的原理是什麼?
在使用qq手機令牌或者銀行的一些令牌時 不需要聯網就可以與伺服器的密碼保持一致 求原理
那東西叫OTP。有時間和事件型兩種。
軟的都是時間的。
國密對OTP有標準文檔,使用國密商用演算法實現。無論硬體令牌也好還是手機上的軟體令牌也好,如果是那種只是一個LCD顯示6個數字的,都是時間和伺服器同步過。
具體工作方式如下:首先密碼學裡有個東西叫偽隨機數生成器(PRNG),這個東西很好玩,它和用於產生真正隨機數的隨機數生成器不一樣,PRNG一般都有一個種子值,所謂的種子值就是它的初始值。同一個種子值在同樣結構的PRNG里每次運行都會生成相同的隨機數序列。如果不知道種子值,那麼生成的隨機數可以說是很難預測的。(此處挖個坑,坑1)
目前用的最多的PRNG叫線性反饋移位寄存器 Linear feedback shift register,LFSR
最基本的是這個結構,也有很多種變形。那4個方格裡面的就是種子值,seed。現在回到坑1里,LFSR生成的隨機數是會重複的,在LFSR結構可靠(涉及到數論里的有限域問題)的情況下,可以產生2^種子長度 -1 個不重複隨機數序列,過了這個數字,就會又回到前一個序列的第一個輸出。所以種子長度決定了隨機數生成器的強度。
前面我們說過,不同的種子在相同的LFSR里會產生完全不同的隨機數序列,所以這個種子可以作為一個密鑰,每個令牌里的種子值都不一樣,一般來說這種令牌的種子長度都在32位以上,也就是說能生成長度為2^32-1的不重複二進位隨機數序列。
那麼在頒發手機令牌或者硬體令牌的時候,伺服器會生成一個隨機的種子值,寫入令牌軟體或者硬體里,並且伺服器自己也保存了一份。
下面回到LFSR上,LFSR可以很簡單的用硬體電路或者軟體實現,輸出和輸入值都是二進位,每個時鐘周期會執行一次,輸出一位二進位數字。
所以如果伺服器和客戶端使用同樣格式的LFSR,用同樣的種子值,執行相同次數,就會一直輸出一樣的數字,把二進位數字做一些處理,比如每次輸出20位二進位數字,轉換成10進位之後去掉6位以後的數字,再顯示出來。這樣在令牌和伺服器時間同步的情況下,就可以生成出相同的數字,當提交到伺服器的時候,伺服器就可以對比令牌和伺服器上利用相同演算法和保存的種子值生成的數字。
所以硬體令牌裡面會有一個精確度比較高的時鐘,而手機也利用了內置時鐘,而且還可以通過網路更加精確的同步時間。
可能有點沒說明白,下面我換一個簡單的說法:
你(令牌)和你朋友(伺服器)約好一個預設的數字,假設是100。同時也和你朋友商量好,在一天24小時里,假如我們打電話或者在網上聊天,我們要預先對暗號,暗號通過了才能開始聊,當然暗號不能一直不變,假如我們在0點到1點內通訊,就把暗號乘以1,假如1點到2點通信,就把暗號乘以2,以此類推。
於是你在下午17點的時候給你朋友打電話,你一看錶,現在正好17點03分,暗號數字要乘以17,所以是1700,你在電話里和你朋友說,暗號是1700。你朋友聽了後,一看錶,現在17點03,和你的暗號是100,100*17是1700,暗號正確,好,繼續聊天。
假如這個朋友比較怪異,和每人聊天都要對暗號,而且每個人的暗號都不一樣,可能和張三的暗號是100,和李四就是123,王五則是567,他把每個人的暗號和對應的名字都寫在一個小本(資料庫)上,方便每個人打電話過來的時候隨時查看。
假如有一天你或者你朋友的表不準了,誤差越大,那麼在任意時間對不上暗號的可能性越高。才疏學淺,用簡單md5給你偽實現。
首次使用時客戶端生成token例如:ABC,伺服器將ABC綁定到你的賬戶,這個token只有你的客戶端和伺服器知道。
驗證時: 客戶端令牌 = md5(201612122300ABC),將加密後的密文(令牌)提交給伺服器校驗,伺服器採用同樣加密演算法即可。有個原始密鑰俗稱種子,然後通過時間和加密演算法運算,時間就是變數,伺服器和客戶端就能通過時間同步了
推薦閱讀:
※《球狀閃電》里提到的在電腦上裝一個插件就能分擔大型計算的一小部分在現實中有實例嗎?這是雲計算嗎?
※2016 AWS Re:Invent 大會上,AWS又發布了哪些讓人驚艷的創新?
※如何評價金山雲新發布的大米雲主機?
※如何系統地學習 Docker?
※七牛的商業模式可以成功嗎?