我可以使用什么正则表达式(如果有)来验证给定的字符串是合法的 ssh rsa 公钥?
我只需要验证实际的密钥——我不关心它前面的密钥类型或它后面的用户名注释。
理想情况下,有人还会提供 python 代码来运行正则表达式验证。
谢谢。
我可以使用什么正则表达式(如果有)来验证给定的字符串是合法的 ssh rsa 公钥?
我只需要验证实际的密钥——我不关心它前面的密钥类型或它后面的用户名注释。
理想情况下,有人还会提供 python 代码来运行正则表达式验证。
谢谢。
“足够好”的检查是查看密钥是否以正确的标题开头。
密钥文件的数据部分应从 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
或者,您可以放弃二进制检查,并AAAAB3NzaC1yc2EA
在 ssh-rsa 密钥的开头查找,我仍然会验证它是有效的 base64。
[编辑] 澄清:
通过规范,如果键是长度前缀字符串,则第一部分。长度被打包为一个大端无符号整数('>I' 对于 python 结构)。这里是 7,因为下面的字符串 'ssh-rsa' 有 7 个字节长。data[4:11]
是接下来的 7 个字节(每个长度前缀),但我编辑了上面的代码以使用一些描述性变量来尝试使其更清晰。如果您想彻底,您还应该检查 ssh-dss,可能还有 pgp-sign-rsa 和 pgp-sign-dss,但它们不太常见。
根据对“前面的密钥类型”和“后面的用户名注释”的引用,我假设您正在谈论以 ssh2 密钥文件格式存储的公钥。
在该格式中,密钥以base64格式存储,因此一个简单的检查就是验证字符串是否仅包含有效的 base64 字符。
如果您想更进一步,您可能会注意到编码密钥的前几个字节指定了密钥类型,并与之匹配。看到这个帖子,它说:
如果对该文本的第一位 (AAAAB3NzaC1yc2EA) 进行 base64 解码,您会发现它以字节 00 00 00 07 开头(表示后面跟着一个 7 个字符的字符串),然后是七个字符“ssh-rsa”,即密钥类型。DSA 密钥以略有不同的字符串 'AAAAB3NzaC1kc3MA' 开头,其解码类似于字符串“ssh-dss”。