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

问题描述:

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

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

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

谢谢。

+0

正如David指出的那样,检查字符串是否只包含有效的Base64字符是一个开始,但即使这样也不能确保它是一个有效的SSH密钥。由于密钥基本上是二进制数据(Base64格式),我不认为正则表达式是验证密钥的合适工具。 – Peter 2010-03-22 18:05:40

+1

你为什么认为你需要这样做? – Callahad 2010-03-22 18:30:05

+1

@Callahad - 我想在我的自动系统放入authorized_keys文件之前确保它是一个有效的密钥。 – Warlax 2010-03-23 01:35:12

“足够好”检查是查看密钥是否以正确的标题开头。

所述密钥文件的数据部分应当从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密钥的开始,位我仍然会验证它是有效的base64。

澄清:
通过规范,第一部分如果密钥是长度前缀字符串。长度被压缩成一个big-endian unsigned int('> I'为一个python结构体)。这里是7,因为下面的字符串'ssh-rsa'是7个字节长。 data[4:11]是接下来的7个字节(每个长度前缀),但我编辑了上面的代码以使用一些描述性变量来尝试并使其更加清晰。如果你想彻底,你还应该检查ssh-dss,可能还有pgp-sign-rsa和pgp-sign-dss,但是它们不太常见。

+0

中描述如果我正确理解你的代码,你会检查'key_string'是一个base64可解码序列,然后确保它以7开头,因为所有rsa pubkeys都以7开头? 'data [4:11] == type'是什么意思? – Warlax 2010-03-23 01:40:35

基于对“之前的密钥类型”和“用户名注释”的引用,我假设你在讨论以ssh2密钥文件格式存储的公钥。

在这种格式下,密钥存储在base64格式,所以一个简单的检查就是验证该字符串只包含有效的base64字符。

如果您想进一步了解一下,您可以注意到,编码密钥的前几个字节指定了密钥类型,并与之匹配。见this post,它说:

如果您的base64解码的 文本(AAAAB3NzaC1yc2EA)第一位,你会 发现它与字节开始00 00 00 07(表示7个字符 字符串跟着),然后是七个 字符“ssh-rsa”,这是 类型的键。 DSA密钥以 稍微不同的字符串 “AAAAB3NzaC1kc3MA”开头,其类似于字符串“ssh-dss”解码 。

+0

“type key comment”布局是openssh格式。 SSH2格式在rfc4716 – JimB 2010-03-22 18:11:53