9

特定の文字列が正当な ssh rsa 公開鍵であることを検証するために使用できる正規表現 (存在する場合) は?

実際のキーを検証するだけで済みます。キーの前にあるキーの種類や、その後にあるユーザー名のコメントは気にしません。

理想的には、誰かが正規表現検証を実行するための Python コードも提供してくれるでしょう。

ありがとう。

4

2 に答える 2

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 キーの先頭を探すこともできAAAAB3NzaC1yc2EAます。ビットが有効な base64 であることを確認します。

[編集] 明確化:
仕様によると、キーが長さのプレフィックス付き文字列である場合の最初の部分。長さは、ビッグ エンディアンの unsigned int (python 構造体の場合は '>I') としてパックされます。次の文字列「ssh-rsa」は 7 バイト長であるため、ここでは 7 です。data[4:11]は次の 7 バイト (長さのプレフィックスごと) ですが、上記のコードを編集して、いくつかの記述変数を使用して、これをより明確にしようとしました。徹底したい場合は、ssh-dss と、場合によっては pgp-sign-rsa と pgp-sign-dss も確認する必要がありますが、これらはあまり一般的ではありません。

于 2010-03-22T18:10:07.097 に答える
2

「前の鍵タイプ」と「後のユーザー名コメント」への参照に基づいて、ssh2鍵ファイル形式で保存された公開鍵について話していると思います。

その形式では、キーはbase64形式で保存されるため、文字列に有効なbase64文字のみが含まれていることを確認するだけで簡単にチェックできます。

もう少し先に進みたい場合は、エンコードされたキーの最初の数バイトがキータイプを指定し、それに一致することに注意してください。この投稿を参照してください。

そのテキストの最初のビット(AAAAB3NzaC1yc2EA)をbase64でデコードすると、バイト00 00 00 07(7文字の文字列が続くことを示す)で始まり、7文字の「ssh-rsa」で始まります。キータイプ。DSAキーは、わずかに異なる文字列 `AAAAB3NzaC1kc3MA'で始まります。これは、文字列"ssh-dss"と同様にデコードされます。

于 2010-03-22T18:02:30.403 に答える