一、需求
我們一開始構想動態密碼的使用場景是這樣的:
(1)現場人員檢視裝置id,把id發給裝置管理人員。
(2)裝置管理人員登入平台,用裝置id換取動態密碼,並把動態密碼發給現場人員。
(3)現場人員把密碼輸入儀器,使用最高許可權。
這樣的流程是比較安全的,唯一的缺陷是現場人員每次使用都要找裝置管理人員,人力成本極高。正是這個缺陷,導致這一方案直接推翻。
我們考慮另外乙個使用場景:
(1)裝置管理人員為現場人員登記資訊(一次性)。
(2)現場人員在需要使用最高許可權時,自己登入平台,獲取動態密碼。
(3)操作過後,儀器記錄現場人員的資訊。
在這個場景之下,裝置管理人員人力成本得以降下,但也引出了一些安全性問題。在這個場景之下,現場人員希望什麼時候使用最高許可權就什麼時候使用,沒有人可以管。兩個場景都有缺陷,綜合考慮,選擇後者。
在第二個場景之下,我們發現,讓現場人員輸入裝置id是沒有意義的。他想操作多個裝置,只需要獲取多次動態密碼即可。所以我們取消輸入裝置id這個步驟。
動態密碼需要滿足這些需求:
(1)足夠簡單,用阿拉伯數字,最初考慮使用6個數字,明顯無法實現,考慮使用8個數字。
(2)密碼中包含使用者資訊。
(3)為防止被旁人竊取密碼,每個密碼只能使用一次。
(4)密碼有有效時間,考慮在同一天內有效。
(5)第2點同時也引出了這個需求:密碼每次都不一樣。
(6)密碼被篡改後,判定為非法密碼。
二、設計
從第2點需求和第4點需求可以看出,密碼中必須包含使用者資訊和時間資訊,而從第6點又可以看出,密碼需要有校驗資訊。這麼多的資訊需要在8個阿拉伯數字裡表現,是設計的難點。
為了節省空間,我們把資訊精確到二進位制位。首先我們需要明確我們的目標:8個阿拉伯數字,能表示的最大的數就是2的26次方(67108864),也就是說,26位是我們的上限。
使用12位代表4096個不同的使用者,基本滿足需求。只剩下14位可用了。
時間資訊需要儲存年月日,如果使用乙個位元組儲存乙個數字(例如bcd碼),共需要24位(3個位元組),一下子就超了。把它們拆分,精確到位,最省的情況如下表所示:資訊年
月日所需位645
這樣的話,我們省了很多,但仍然用掉了15位,超出了我們的限額。我們希望在時間資訊上擠出空間來。
我們假設有這樣乙個函式f(y,m,d),它把時間資訊轉化成乙個數,不同的日期對應不同的值,不會重複。考慮最簡單的情況,我們把函式定義成如下形式:
f(y,m,d)=ay+bm+cd
那麼,另外乙個日期對應的值為:
f(y』,m』,d』)=ay』+bm』+cd』
只要在y!=y』,m!=m』,d!=d』的情況下,f(y,m,d)!=f(y』,m』,d』)即滿足需求。
f(y,m,d)-f(y』,m』,d』)=(ay+bm+cd)-(ay』+bm』+cd』)
=a(y-y』)+b(m-m』)+c(d-d』)
由於年的變化是很緩慢的,我們考慮在一年內,都沒有重複的值。也就是
b(m-m』)+c(d-d』)=bδ
m+cδ
d!=0
即bδm!=-cδd
我們知道,月的變化取值為1-12,日的變化取值為1-31,那麼δ
m的取值為-11~11,
δd的取值為-30~30。考慮到有負數的存在,上式我們直接可以寫成:
b/c!=δd/
δm我們可以看出,只要b取31,上式兩邊就永遠不會相等。也就是說,
f(y,m,d)=y+31m+d
在一年內也不會有重複的值。
這樣的話,此式最大的值為31*12+31+99(考慮年用到2099)=502,我們用9位(512)即能表示。
經過上面的時間資訊縮減之後,我們剩下5位來存放校驗資訊。常見的一些校驗演算法根本是無法使用的(md5要16位元組,而且計算複雜,crc兩個位元組,最簡單的算lrc也要乙個位元組8位)。如果單純用5位做校驗和,重複的概率是1/32,感覺不夠安全。
我們已經沒辦法再縮減時間資訊使用的位數,只能考慮對使用者id開刀。使用者id使用12位存放4096個使用者的資訊,這是我們考慮極限的使用者數。在一開始,或許512個使用者就能滿足。於是,我們採取這樣的折中方案:
(1)使用者id使用9位,把3位讓給校驗和,這樣重複的概率是1/256,應該是可以使用的。
(2)當使用者增長超過512時,我們增加數字位數。如果使用9位阿拉伯數字,我們可以存放29位的資訊,多出3位,增加在使用者id上,一共可存放4096個使用者。
上面的設計,還沒有滿足需求裡的第3、5點。要讓密碼每次都不一樣,其實我們只需要增加幾位,放乙個隨機數就行。但偏偏我們已經沒有空間去放這個隨機數了。
在這裡,我們需要先說明使用何種加密方法。為了足夠的簡單(保證儀器能快速計算),又不失安全性,我們使用異或的加密方法。只要使用者猜不到跟明文異或的密碼,資料就是安全的。
我們回到上面的問題。如果我們使用不同的密碼去對明文進行異或,得到的結果就是不一樣的。所以我們有一種這樣的方案:存放n條用於異或的密碼,每次用不同的密碼去異或,就會產生不同的結果。解密的時候,我們尋回原先異或的密碼,就能成功解密。
但是我們馬上會發現問題:我們如何知道明文是使用了哪個密碼去異或的呢?使用者id和時間資訊都是固定的,我們無法從這些資訊裡面提取出乙個索引。那我們可以使用當前時間作為乙個索引。假如我們有24個密碼,各對應24個小時。這樣的話,我們在使用動態密碼時,會多出一條限制:從平台上獲取密碼之後,必須在乙個小時內使用。這樣的限制並不影響,可行。
在我們使用多個密碼去異或時,原來的校驗和演算法會出現問題。我們必須找出24個異或碼,經過跟明文異或之後,不影響原文的校驗和。這樣的異或碼可以使用以下方法得到:
(1)因為我們使用8位校驗和,所以我們把資料分成8位一段,不夠的使用0補齊。
(2)把(總位數-8)個位隨機填充0或1。
(3)求出(總位數-8)個位的校驗和。
(4)把這個校驗和填充到剩下的8位裡面。
三、最終方案
動態密碼的設計如下:
8位阿拉伯數字
資訊
時間校驗和
使用者id
位數98
99位阿拉伯數字
資訊
時間校驗和
使用者id
位數98
12時間=(年-2018)+31*月+日
校驗和為8位一段異或。
加密方法是將整個明文跟金鑰進行異或。
動態密碼原理
最近剛接手了乙個安全認證專案。其中涉及了很多安全認證手段,如動態密碼,ca證書,usbkey,指紋等等。這次簡單地介紹一下動態密碼的原理。什麼是動態口令牌?動態口令牌是一種內建電源 密碼生成晶元和顯示屏 根據專門的演算法每隔一定時間自動更新動態口令的專用硬體。基於該動態密碼技術的系統又稱一次一密 o...
程式中新增動態使用者密碼
程式中往往會設定乙個超級管理員工號,而這個工號是不寫入資料庫,直接編譯在程式中,這樣做的目的一是為了方便了。思路很簡單 新增sa,密碼為系統當前日期的月 日,然後在加上一常數888888。如果輸入密碼正確,直接跳轉到使用者與密碼判斷語句之後。1string ls pass,ls s1,ls s2 2...
電子密碼鎖設計
01 設計要求 1 密碼為6位長度,初始值是111111。有三次登陸機會,每錯一次,紅燈及蜂鳴器各亮 響一秒,液晶顯示錯誤資訊。錯三次後,禁止再登陸。正確登陸後綠燈亮。2 可修改密碼,但須先正確輸入原密碼。設定新密碼需連續正確輸入兩次,同時密碼須有相應格式,如密碼需8位數字。其餘格式,如不能連續8位...