使用正则表达式进行ssh-rsa公钥验证

时间:2010-03-22 17:41:02

标签: python regex validation ssh-keys

我可以使用哪些正则表达式(如果有)来验证给定字符串是否是合法的ssh rsa公钥?

我只需要验证实际的密钥 - 我不关心它之前的密钥类型或之后的用户名注释。

理想情况下,有人还会提供python代码来运行正则表达式验证。

感谢。

2 个答案:

答案 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”。