首先:非常感谢 Topaco,您为我提供了如何生成这样的指纹的基本提示。我与 WWW 上的其他资源进行了交叉检查,无法提供任何人使用的代码。
假设我们已经加载了密钥并将其存储在public_key
. 然后可以按如下方式生成指纹:
rawKeyData = public_key.public_bytes(
encoding=serialization.Encoding.OpenSSH,
format=serialization.PublicFormat.OpenSSH,
)
# prepare for hashing
m = re.match("ssh-rsa ([A-Za-z0-9+/=]+)", rawKeyData.decode("utf-8"))
assert m is not None
base64BinaryData = m.group(1).encode("utf-8")
rawBinaryData = base64.b64decode(base64BinaryData)
# now create the hash
hexDigest = hashlib.md5(rawBinaryData).hexdigest()
# formatting for output similar to "ssh-keygen -l -E md5 -f <pubkeyfile>"
chunks = [ hexDigest[i:i+2] for i in range(0, len(hexDigest), 2) ]
fingerprint = str(self.__public_key.key_size) + "MD5:" + ":".join(chunks) + " (RSA)"
这提供了这样的输出:
2048 MD5:bd:5a:67:a3:4c:46:9d:2c:63:78:7e:68:bc:82:eb:23 (RSA)
与 OpenSSH 指纹的唯一区别:这里的输出中不包含电子邮件地址。
一些备注:
- 正则表达式
- 我在这里使用正则表达式来解析输出。这样做是为了安全,因为这样我可以确保输出与此处数据处理的期望相匹配。
- base64
- base64 可能会向数据添加填充。
- base64 可以安全使用,因为填充是确定性的。
- md5
- 这里使用 MD5 输出。
- 如果需要,您可以用任何其他哈希算法安全地替换 MD5 - 例如 SHA256。