8.5. S/Key

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,可以被記錄或列印出來。

8.5.1. 安全連接的初始化

首先是當通過一個安全連接登陸時,初始化 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 登陸系統時,系統將記住這些參數,然後返回給 ,所以不必記住。最後一行給出了與那些參數和秘密密碼相一致的特定的一 次性密碼;如果需要立刻重新登入,這個一次性密碼就是使用的。

8.5.2. 不安全連接初始化

通過一個不安全的連接來初始化 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.

8.5.3. 產生一個簡單的一次性密碼

一旦初始化 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 的流覽器中運行。

8.5.4. 產生多個一次性密碼

有時,會來到不能訪問一個可信任的機器或安全連接的地方。在這個例子中,可以 使用密碼命令來產生許多一次性密碼,例如:

    % 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 指定了最後的反復計算的號碼是什麼。注意這些將按與 實際相反的順序列印出來。如果是一個偏執狂,可以手工寫下這些結果;否則可以打 印出來。注意,每一行都顯示了重複計算數和一次性的密碼。

8.5.5. Unix 密碼的限制使用

這種限制可能是基於主機名,用戶名,終端口,或登陸時的 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 密碼;這將被用在撥號中。