將軍令是如何工作的?不知道它隨機產生的密碼怎麼就和系統對上號了?
感覺挺牛逼的啊!
PS 很多人提到了時間參數的作用 很想知道如果採用時間作為一個參數的話 如何解決同步的問題 相對來說將軍令的價格也就一個電子手錶的錢 其精度不可能太高 但又要保證幾年的使用時間 如何解決時間上的誤差
這個東西的學名叫做,one-time password,目前已經發布為RFC標準,有興趣可以看下RFC 6238 - TOTP: Time-Based One-Time Password Algorithm。裡面有詳細的介紹和demo。
簡單點介紹下原理吧:
1.首先,令牌時間和伺服器時間都採用UTC時間作為標準時間2.通過獲取當前時間距離1970年1月1日0時0分0秒的時間戳秒數,除以時間步長,即60秒,可以計算出當前開始計數的時間步長,以這個開始的時間步長和令牌的pin生成一個密碼。3.伺服器上同樣採用此演算法生成密碼。4.登陸的時候,校驗用戶提交的密碼演算法即可。5.時鐘誤差如果超過計數的時間步長,同過一個同步功能來修正誤差,因此此種令牌都會提供一個時鐘同步的功能。具體的你去看下rfc的規範即可。具體情況不了解,以下純是憑在學校裡面的知識回答的。
我的理解是說應該就是在將軍令裡面集成一個通過 時間+令牌id 離線生成密碼的晶元,伺服器能通過時間戳來驗證這個密碼。所以將軍令會存在偶爾密碼不正確的時候(主要是伺服器時間跟令牌內置時間有一定誤差導致)。時間遠沒有大家想的那麼不精確,自從石英晶振這玩意兒被發明後,電子計時上升了無數個檔次,其次伺服器端也可以有一定的容錯性,即產生的時間與現在不超過多少分鐘都算有效。
然後在容許誤差內校對後在伺服器端記錄偏移(恐怕用不著這麼複雜)。
沒想的那麼複雜,現在的鐘錶不準更多是因為機械和電池部分的原因,石英晶振的準度非常高。
石英晶振這貨的價格可以自己去搜下。搜了一下這是什麼東西,參考了一下@吳沛儒 的描述,然後覺得基本上大家的答案綜合一下應該差不多。
首先,如果是6位密碼,那肯定不能算「加密」,只能是哈希,因為6位密碼不可能反推出明文的,只能是客戶端和服務端各自計算hash值,然後比對。
然後樓上有若干提到「密鑰」的,公開的SN號肯定不能拿來當密鑰,不然也太二了。我猜很可能跟密碼卡什麼的一樣,每個客戶端有一個密鑰,伺服器端保存所有客戶端的密鑰。然後客戶端每次做哈希的時候把時間和自己的密鑰連起來,做hash然後輸出即可。
最後如果按網站上的描述,60秒一換密碼,那肯定有晶振在裡面,不然不可能做到的。一般電子手錶一個月能差10秒左右,那麼即使一個將軍令用一年,最多也就偏幾分鐘,伺服器端在當前時間前後多做幾次哈希,也就能對上號了。
如果像我猜的一樣,密鑰(其實如果是用來算哈希的,一般就不叫密鑰了,叫salt: http://zh.wikipedia.org/wiki/%E7%9B%90_%28%E5%AF%86%E7%A0%81%E5%AD%A6%29)是保存在伺服器端而不是根據SN號計算出來的話,那麼這個晶元是很難被偽造的,但是可以被複制。沒有完全明白這個東西是幹什麼的,因此不知道可複製的晶元對這個系統的安全性有什麼影響。保存剛好最近在研究這個~回答試試看 ^_^
以下都只是猜測,畢竟公布了的話,將軍令就不能保證帳號安全了。
====================================================================
已知: 1. 每分鐘產生一個6位密碼 2·不發射信號,也就是說它離場之後不與伺服器聯繫。 3·唯一被記錄的是SN號。 4·不同的將軍令同時按出的動態密碼是不同的。 5·不允許換電池,應該是為了保證與伺服器時間同步。 推理得: 以時間(或以時間經過演算法運算後得出的結果)為明文,SN號(或以SN號經過演算法運算後得出的結果)為密鑰,經過一個統一的函數演算法後得出的密文,就是將軍令顯示出的那6個數字。 也就是說 6個數字=函數(時間,SN碼,其他)其中:「其他」可能有也可能沒有,也許還與綁定帳號的信息有關,這就不得而知了。
而那個等式中的函數可能是各種不同的加密演算法,DES,RSA,IDEA,DSA什麼什麼的。都是最近用的比較多的演算法。
==================================================================== 我密碼編碼學只學了半年·····說的不知道對不對·····我已經儘力了~~~~·囧rz~~~``````````修改·····&>_&<
以防有人看不懂啊~科普一下~~~密碼演算法可以看作是一個複雜的函數變換:C =函數(M, Key )
C代表密文,即加密後得到的字元序列(上面說的6位密碼),M代表明文即待加密的字元序列(也就是上面的時間);Key表示密鑰(也就是上面說的SN碼),是秘密選定的一個字元序列。密碼學的一個原則是「一切秘密寓於密鑰之中」,演算法可以公開。當加密完成後,可以將密文通過不安全渠道送給收信人,只有擁有解密密鑰的收信人可以對密文進行解密即反變換得到明文,密鑰的傳遞必須通過安全渠道。寫到這裡又有個猜想
既然說「一切秘密寓於密鑰之中」,那麼SN可能是密鑰,這樣將軍令的演算法絕對不能泄漏了,不然知道SN碼,再時間同步一下就能知道密碼。或者SN不是密鑰,而是SN經過一個演算法得出的結果作為密鑰。
或者的或者將軍令的晶元和SN碼對應,以晶元編號為密鑰。啊~~~真是越想越繞啊~~~~半年的水平果然還是很低~~啊哈哈。
僅供參考,希望能拋磚引玉喲~!其實這就是RSA動態口令的一種動態口令分類大體分為同步口令跟非同步口令同步又分時間同步與事件同步將軍令60S一換密碼也就是說它是基於時間同步的,晶振肯定是有的,而且其精度要求極為嚴格,但是對於非在線設備時間偏移是肯定的,怎麼處理這個問題呢,在你進行的每次認證時,伺服器端將會檢測令牌的時鐘偏移量,相應不斷的微調自己的時間記錄,對於失去時間同步的令牌,可以通過增大偏移量的技術±10分鐘來遠程同步,但對於超出20分鐘的時間同步令牌,將無法繼續使用或進行遠程同步,就得返廠了。
我覺得和時間沒有必然的關係,將軍令本身晶元處理能力應該比較低的,要與伺服器保證一致感覺不實際,即使是現在的手機,貌似時鐘也同步也是需要聯網才能解決的。所以我覺得時間並不是將軍令的參數。
然後是演算法,演算法應該不能作為保密的東西,如果一個加密演算法保密的話,這個演算法本身就是不安全的。
SN應該也不是密鑰,密鑰是保密的東西,所以不可能是任何人都可以獲取的。
既然這樣,貌似就找不到密鑰了。所以可以考慮是不是用的hash的方法
在服務端和客戶端應該同時有一個使用的計數器,同步時間很難,但是記錄次數是很容易的。 設上一次的結果為On,那麼本次的輸入可能是(On|Times)那麼,不管伺服器端還是客戶端所得出的結果都是合理的。當然可能不是這麼簡單的,不過感覺應該是這個原理。推薦閱讀:
※QQ密碼資料庫真的泄露了么?
※一道古典密碼題到底怎麼解?多表?
※密碼太多記不住怎麼辦?全弄成一樣又不安全。?
※1Password 的安全性有多高?
※ZIP加密壓縮破解方法Known plaintext attack通過Key推出密碼的原理是什麼?