我可以使用哪些正则表达式(如果有)来验证给定字符串是否是合法的ssh rsa公钥?
我只需要验证实际的密钥 - 我不关心它之前的密钥类型或之后的用户名注释。
理想情况下,有人还会提供python代码来运行正则表达式验证。
感谢。
答案 0 :(得分: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。
[编辑]澄清:
通过规范,如果密钥是长度为前缀的字符串,则第一部分。长度打包为big-endian unsigned int(对于python结构,'> I')。这里是7,因为以下字符串'ssh-rsa'长7个字节。 data[4:11]
是接下来的7个字节(每个长度前缀),但我编辑了上面的代码以使用一些描述性变量来尝试使其更加清晰。如果你想要彻底,你还应该检查ssh-dss,可能还有pgp-sign-rsa和pgp-sign-dss,但它们不太常见。
答案 1 :(得分:2)
基于对“之前的密钥类型”和“之后的用户名评论”的引用,我假设您正在讨论以ssh2密钥文件格式存储的公钥。
在该格式中,密钥以base64格式存储,因此只需检查字符串是否只包含有效的base64字符。
如果你想更进一步,你可以注意到编码密钥的前几个字节指定密钥类型,并匹配。请参阅this post,其中包含:
如果您对第一位进行64位解码 那个文字(AAAAB3NzaC1yc2EA)你会的 发现它以字节00 00开头 00 07(表示7个字符 字符串跟随)然后是七 字符“ssh-rsa”,这是关键 类型。 DSA密钥以 字符串略有不同 `AAAAB3NzaC1kc3MA',解码 类似于字符串“ssh-dss”。