使用 ssh-keygen
生成的 key 对在 macOS 上可以有不同的格式。
SecKey
API OpenSSH/BSD 使用这种非标准化格式 here .
现在我只需要能够检查私钥是否设置了密码,这样我就可以提示用户输入它,而不必处理不同 key 格式的复杂性。
macOS 上是否有通过 Swift 或 C API 快速检查 key 是否设置了密码的方法?
最佳答案
未加密和加密的私钥之间的区别在于 key blob 是加密的。您需要先解密私钥 blob 数据,然后才能使用私钥 blob。所以一旦加密的私钥数据被解码,你就可以像对待未加密的私钥数据一样对待它。
未加密的私钥 blob PEM 文件如下所示:
—–BEGIN PRIVATE KEY—–
{base64 private key blob)
—–END PRIVATE KEY—–
加密的 RSA 私钥 PEM 文件如下所示:—–BEGIN RSA PRIVATE KEY—–
Proc-Type: 4,ENCRYPTED
DEK-Info: {encryption algorithm},{salt}
{base64 encrypted private key blob)
—–END RSA PRIVATE KEY—–
例如—–BEGIN RSA PRIVATE KEY—–
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,AB8E2B5B2D989271273F6730B6F9C687
{base64 encrypted private key blob)
—–END RSA PRIVATE KEY—–
因此,要解码私钥数据,您需要:完成后,解密的私钥 blob 可以像未编码的私钥 blob 一样对待。
支持的加密算法的数量相当多,因此您可能希望支持算法的子集。例如“DES-EDE3-CBC”、“AES-xxx-CBC”等
要生成 IV,您需要将 salt 字符串转换为二进制。 salt 字符串是一个十六进制编码的字符串,因此使用十六进制字符串字符到字节转换器将每两个字符串字符转换为一个字节。
为了生成加密算法 key ,您需要 key 大小(例如 DES-EDE3-CBC 是 192 位,AES-256-CBC 是 256 位)。使用循环将 MD5 哈希结果附加到 key 来构建 key “位”,直到生成所需的所有 key 位。
MD5 HASH 循环生成将包括:
请参阅 EVP_BytesToKey 的 openssl 源代码 key 位生成示例的方法。
现在可以使用上面的 IV 和 KEY 构建使用所选的加密算法对加密的私钥 blob 进行解码。
关于检查 SSH 私钥是否加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57655324/