0

使用此命令可以生成 RSA 公钥-私钥对:

ssh-keygen -f key

现在我想在 Python 中使用 module 加载这些键cryptography。例子:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

with open("key.pub", "rb") as f:
    datapub = f.read()

public_key = serialization.load_ssh_public_key(datapub, backend=default_backend())

但是现在:如何从这个公钥生成指纹?使用 OpenSSH,这可以使用ssh-keygen -lf key.pub. 但是你在 Python 中是怎么做到的呢?

4

1 回答 1

0

首先:非常感谢 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。
于 2020-11-08T21:28:55.150 回答