S/key 是基於單向 hash 功能的一次性密碼管理方式。FreeBSD 為了考慮相容性,就使 用 MD4 hash 函數,但另外系統則使用 MD5 和D ES-MAC。從1.1.5 版開始,S/key 已經成為 FreeBSD 的基本系統,同時也廣泛應用於其他作業系統。S/key 是Bell Communications Research, Inc 的注冊商標。
下面將討論三種不同的密碼形式。第一種是通常使用的 Unix 風格或 Kerberos 密碼; 叫做 Unix password。第二種是由 S/key 程式產生,然後被 keyinit 程式和登陸命 令接受的一次性密碼;叫做 one-time password。最後一種密碼是由專門的密碼生 成程式生成的秘密密碼;叫做 secret password 或絕對 password。
秘密密碼與 unix password 毫無關係;也可能是一樣的,但並不推薦使用。S/key 秘密密碼不象 unix 密碼需要限制在8 位元以內,可能會更長。一般都使用 6 到 7 位的長 度。另外,S/key 系統操作完全獨立於 unix password 系統。
除了密碼,對於 S/key 有兩個資料很重要。一個是以 seed 或 key 出名,包含兩個字母 和五個數字。另外的被叫做 iteration count,在 1 到 100 之間。S/key 通過連接"種子" (seed)和秘密密碼來生成一次性密碼,然後通過反復計算多次應用 MD4 hash,再把結果 變成六個英文字。這六個英文字就是你的一次性密碼。如果用戶提供的密碼的 hash 值與先 前的密碼相一致,那用戶就通過了認證;每個成功的登陸確保用戶和登陸程式保持同步之 後,計算的次數就不斷減少。當反復計算的降到 1 時,S/key 必須被重新初始化。
有四個程式被包含在 S/key 系統中,下面會談到。密碼程式接受一個反復計算數, 一個種子,和一個秘密密碼,然後產生一個一次性密碼。Keyinit 程式被用來初始化 S/key, 然後改變密碼,反復計算數或種子;不是接受一個秘密密碼,就是一個反復計算數,種 子和一次性密碼。Keyinfo 程式會檢查檔,然後列印出被調用的當前反復計算數和種子。 最後,login 和 su 套裝程式含了用於認證 S/key 一次性密碼的必需的邏輯性。login 程式也 可以不使用unix 密碼。
將講述四種不同的操作。第一種是首先通過一個安全連接設置 S/key 使用 keyinit 程式,或改變密碼或種子。第二種操作是通過一個不安全的連接使用 keyinit 程式, 通過一個安全的連接與密碼程式相關聯,同樣能達到目的。第三種是使用密碼程式產生許 多 key,可以被記錄或列印出來。
首先是當通過一個安全連接登陸時,初始化 S/key,改變密碼,或改變種子, 當自己登陸時,使用不帶任何參數的 keyinit 程式:
% keyinit Adding unfurl: Reminder - Only use this method if you are directly connected. If you are using telnet or rlogin exit with no password and use keyinit -s. Enter secret password: Again secret password: ID unfurl s/key is 99 to17757 DEFY CLUB PRO NASH LACE SOFT
在鍵入秘密密碼時:必須鍵入一個密碼或短語。記住,這不是用來登入的密碼, 只是用來產生一次性登陸密碼。ID 行給出了特定的 S/key 實例的參數;登陸名, 反復計算數,和種子。當用 S/key 登陸系統時,系統將記住這些參數,然後返回給 ,所以不必記住。最後一行給出了與那些參數和秘密密碼相一致的特定的一 次性密碼;如果需要立刻重新登入,這個一次性密碼就是使用的。
通過一個不安全的連接來初始化 S/key 或改變秘密密碼,必須已經有連接到可 以運行密碼程式的地方的安全連接。這可以是在M acintosh 上桌面訪問的方式,或是在 信任的機器上的一個 shell 命令。也必須指定一個反復計算數(通常是100),可以使 用自己的種子,或使用一個隨機產生的值。在一個不安全的連接上,可以使用 keyinit -s 命令:
% keyinit -s Updating unfurl: Old key: to17758 Reminder you need the 6 English words from the key command. Enter sequence count from 1 to 9999: 100 Enter new key [default to17759]: s/key 100 to 17759 s/key access password:
要接受默認的種子,鍵入 return。然後鍵入一個訪問密碼,轉移到安全連接或 S/key 桌面程式,給指定一樣的參數:
% key 100 to17759 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: <secret password> CURE MIKE BANE HIM RACY GORE
現在,切換到不安全的連接,拷貝一次性通過密碼程式產生的一次性密碼給 keyinit 程式:
s/key access password:CURE MIKE BANE HIM RACY GORE ID unfurl s/key is 100 to17759 CURE MIKE BANE HIM RACY GORE
The rest of the description from the previous section applies here as well.
一旦初始化 S/key,當登入時,會看到下面的命令行:
% telnet example.com Trying 10.0.0.1... Connected to example.com Escape character is '^]'. FreeBSD/i386 (example.com) (ttypa) login: <username> s/key 97 fw13894 Password:
另外,S/key 有一個很有用的特性:如果在密碼行鍵入 return 鍵,登入程式將會把 鍵入的密碼顯示出來,所以可以看到鍵入的密碼。如果試圖手工鍵入一個 S/key,這 個非常有用。如果這台機器被配置成通過一個來自源機器的連接不接受 unix 密碼,命令行 也將包括注意(S/key 必須),指出只有 s/key 一次性密碼將被接受。 基於這點,必須產生一次性密碼來回答這個登入命令。這必須在一個可以運行密 碼命令的可信任的系統上做。密碼程式既需要反復計算數和種子,也需要命令行選項。可 以從登入的機器的命令行剪切和粘貼這些選項。 在可信任的系統上:
% key 97 fw13894 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: WELD LIP ACTS ENDS ME HAAG
現在,已經有了可以繼續登陸的一次性密碼:
login: <username> s/key 97 fw13894 Password: <return to enable echo> s/key 97 fw13894 Password [echo on]: WELD LIP ACTS ENDS ME HAAG Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...
如果有一個可信任的系統,這是最容易的機制。有一個 java S/key 密碼小程式,The Java OTP Calculator,可以下載和在本地支援 java 的流覽器中運行。
有時,會來到不能訪問一個可信任的機器或安全連接的地方。在這個例子中,可以 使用密碼命令來產生許多一次性密碼,例如:
% key -n 5 30 zz99999 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: <secret password> 26: SODA RUDE LEA LIND BUDD SILT 27: JILT SPY DUTY GLOW COWL ROT 28: THEM OW COLA RUNT BONG SCOT 29: COT MASH BARR BRIM NAN FLAG 30: CAN KNEE CAST NAME FOLK BILK
-n 5 按順序請求 5 個密匙,30 指定了最後的反復計算的號碼是什麼。注意這些將按與 實際相反的順序列印出來。如果是一個偏執狂,可以手工寫下這些結果;否則可以打 印出來。注意,每一行都顯示了重複計算數和一次性的密碼。
這種限制可能是基於主機名,用戶名,終端口,或登陸時的 IP 位址的 unix 密碼的使用。 這些限制可以在配置檔 /etc/skey.access 中找到。skey.access 的手冊中,有這個文 件的完整格式和細節。
如果沒有 /etc/skey.access 檔(這是 FreeBSD 默認的),那所有的用戶將被允許使 用 unix 密碼。如果檔存在,那所有的用戶將被要求使用 s/key,除非明確地允許這樣做。 在所有的案例中,unix 密碼是允許用在控制臺的。
這兒是一個配置檔的例子,下面舉三種普通使用的配置例子:
permit internet 192.168.0.0 255.255.0.0 permit user fnord permit port ttyd0
第一行允許Ip 源位址與指定的值和遮罩相配的用戶使用unix 密碼。這不應當被認 為是一種安全的機制,但應當提醒那些使用不安全連接的網路的用戶必須使用 s/key 驗證。 第二行允許指定用戶名在任何時候使用 unix 密碼,在這個例子中是 fnord。一般來講, 這將被那些不能使用密碼程式的人或不可教育的人來使用。
第三行允許所有的通過指定的終端行登陸的用戶使用 unix 密碼;這將被用在撥號中。