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.
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
Tại sao bạn tin rằng bạn cần phải làm điều này? – Callahad
@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