2010-03-22 61 views
9

Tôi có thể sử dụng cụm từ thông dụng nào (nếu có) để xác thực rằng chuỗi đã cho là khóa công khai hợp pháp ssh rsa?xác thực khóa công khai ssh-rsa bằng cách sử dụng cụm từ thông dụng

Tôi chỉ cần xác thực khóa thực tế - Tôi không quan tâm đến loại khóa đứng trước nó hoặc nhận xét tên người dùng sau nó.

Lý tưởng nhất, ai đó cũng sẽ cung cấp mã python để chạy xác thực regex.

Cảm ơn.

+0

Như được chỉ ra bởi David, kiểm tra xem chuỗi chỉ chứa ký tự Base64 hợp lệ là bắt đầu, nhưng ngay cả điều này cũng không đảm bảo rằng đó là khóa SSH hợp lệ. Vì khóa cơ bản là dữ liệu nhị phân (ở định dạng Base64), tôi không nghĩ rằng regex là công cụ thích hợp để xác thực khóa. – Peter

+1

Tại sao bạn tin rằng bạn cần phải làm điều này? – Callahad

+1

@Callahad - Tôi muốn đảm bảo đó là khóa hợp lệ trước khi hệ thống tự động của tôi đặt vào tệp authorized_keys. – Warlax

Trả lời

11

Kiểm tra "đủ tốt" để xem liệu khóa có bắt đầu với tiêu đề chính xác không.

Phần dữ liệu của keyfile nên giải mã từ base64, hoặc nó sẽ thất bại với một base64.binascii.Error

Unpack 4 byte đầu tiên (một int), mà nên là 7. Đây là chiều dài của chuỗi sau (tôi đoán điều này có thể khác, nhưng bạn chỉ quan tâm đến 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 

Ngoài ra, bạn có thể bỏ kiểm tra nhị phân, và tìm kiếm AAAAB3NzaC1yc2EA vào lúc bắt đầu của một khoá ssh-rsa, chút tôi vẫn sẽ xác minh đó là base64 hợp lệ.

[sửa] Làm rõ:
Thông qua đặc điểm kỹ thuật, phần đầu tiên nếu khóa là chuỗi có độ dài tiền tố. Chiều dài được đóng gói như là một int lớn không dấu ('> I' cho một cấu trúc python). Đó là một 7 ở đây, bởi vì chuỗi sau, 'ssh-rsa', dài 7 byte. data[4:11] là 7 byte tiếp theo (theo tiền tố độ dài), nhưng tôi đã chỉnh sửa mã ở trên để sử dụng một số biến mô tả để thử và làm cho điều này rõ ràng hơn. Nếu bạn muốn được toàn diện, bạn cũng nên kiểm tra ssh-dss, và có thể pgp-sign-rsa, và pgp-sign-dss, nhưng chúng ít phổ biến hơn nhiều.

+0

Nếu tôi hiểu mã của bạn một cách chính xác, bạn đang kiểm tra 'key_string' là chuỗi có thể giải mã base64 và sau đó đảm bảo bắt đầu bằng 7 vì tất cả các pub rsa bắt đầu bằng 7? 'dữ liệu [4:11] == loại' có nghĩa là gì? – Warlax

1

Dựa trên các tham chiếu đến "loại khóa đứng trước nó" và "nhận xét tên người dùng sau nó", tôi giả sử bạn đang nói về khóa công khai được lưu trữ ở định dạng khóa ssh2.

Trong định dạng đó, khóa được lưu trữ ở định dạng base64, do đó, việc kiểm tra đơn giản sẽ là xác minh rằng chuỗi chỉ chứa các ký tự base64 hợp lệ.

Nếu bạn muốn tiến xa hơn một chút, bạn có thể lưu ý rằng một vài byte đầu tiên của khóa được mã hóa chỉ định loại khóa và khớp với điều đó. Xem this post, mà nói:

Nếu bạn base64-giải mã bit đầu tiên của rằng văn bản (AAAAB3NzaC1yc2EA) bạn sẽ thấy rằng nó bắt đầu với byte 00 00 00 07 (chỉ ra rằng một 7 ký tự chuỗi sau) và sau đó là bảy ký tự "ssh-rsa", là loại khóa . Khóa DSA bắt đầu bằng chuỗi hơi khác nhau `AAAAB3NzaC1kc3MA ', giải mã tương tự như chuỗi" ssh-dss ".

+0

bố cục "loại nhận xét chính" là định dạng openssh. Định dạng SSH2 được mô tả trong rfc4716 – JimB

Các vấn đề liên quan