2010-03-22 389 views
9

我可以使用什麼正則表達式(如果有的話)來驗證給定的字符串是合法的ssh rsa公鑰?使用正則表達式的ssh-rsa公鑰驗證

我只需要驗證實際的密鑰 - 我不在乎它之前的密鑰類型或用戶名註釋。

理想情況下,有人還會提供python代碼來運行正則表達式驗證。

謝謝。

+0

正如David指出的那樣,檢查字符串是否只包含有效的Base64字符是一個開始,但即使這樣也不能確保它是一個有效的SSH密鑰。由於密鑰基本上是二進制數據(Base64格式),我不認爲正則表達式是驗證密鑰的合適工具。 – Peter 2010-03-22 18:05:40

+1

你爲什麼認爲你需要這樣做? – Callahad 2010-03-22 18:30:05

+1

@Callahad - 我想在我的自動系統放入authorized_keys文件之前確保它是一個有效的密鑰。 – Warlax 2010-03-23 01:35:12

回答

11

「足夠好」檢查是查看密鑰是否以正確的標題開頭。

所述密鑰文件的數據部分應當從BASE64解碼,否則會失敗,出現一個base64.binascii.Error

拆開前4個字節(一個int),這應該是7.這是 長度下面的字符串(我想這可能是不同的,但你只關心ssh-rsa)。

openssh_pubkey = open('keyfile').read() 
type, key_string, comment = openssh_pubkey.split() 
data = base64.decodestring(key_string) 
int_len = 4 
str_len = struct.unpack('>I', data[:int_len])[0] # this should return 7 
data[int_len:int_len+str_len] == type 

或者,你可以放棄二進制檢查,查找​​在SSH-RSA密鑰的開始,位我仍然會驗證它是有效的base64。

澄清:
通過規範,第一部分如果密鑰是長度前綴字符串。長度被壓縮成一個big-endian unsigned int('> I'爲一個python結構體)。這裏是7,因爲下面的字符串'ssh-rsa'是7個字節長。 data[4:11]是接下來的7個字節(每個長度前綴),但我編輯了上面的代碼以使用一些描述性變量來嘗試並使其更加清晰。如果你想徹底,你還應該檢查ssh-dss,可能還有pgp-sign-rsa和pgp-sign-dss,但是它們不太常見。

+0

中描述如果我正確理解你的代碼,你會檢查'key_string'是一個base64可解碼序列,然後確保它以7開頭,因爲所有rsa pubkeys都以7開頭? 'data [4:11] == type'是什麼意思? – Warlax 2010-03-23 01:40:35

1

基於對「之前的密鑰類型」和「用戶名註釋」的引用,我假設你在討論以ssh2密鑰文件格式存儲的公鑰。

在這種格式下,密鑰存儲在base64格式,所以一個簡單的檢查就是驗證該字符串只包含有效的base64字符。

如果您想進一步瞭解一下,您可以注意到,編碼密鑰的前幾個字節指定了密鑰類型,並與之匹配。見this post,它說:

如果您的base64解碼的 文本(AAAAB3NzaC1yc2EA)第一位,你會 發現它與字節開始00 00 00 07(表示7個字符 字符串跟着),然後是七個 字符「ssh-rsa」,這是 類型的鍵。 DSA密鑰以 稍微不同的字符串 「AAAAB3NzaC1kc3MA」開頭,其類似於字符串「ssh-dss」解碼 。

+0

「type key comment」佈局是openssh格式。 SSH2格式在rfc4716 – JimB 2010-03-22 18:11:53