检查 SSH 私钥是否加密

标签 c swift macos ssh

使用 ssh-keygen 生成的 key 对在 macOS 上可以有不同的格式。

  • macOS 可读的标准 PEM ASN.1 对象 SecKey API
  • 带有文本标题的 PEM
  • OpenSSH key
  • OpenSSH 加密 key

  • 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—–
    
    因此,要解码私钥数据,您需要:
  • 解析 DEK-Info加密算法和盐(确认第一行的好主意是:“Proc-Type : 4,ENCRYPTED”)。
  • 解码 base64 加密的私钥 blob。
  • 根据salt和密码生成加密算法“key”和“IV”
  • 解码加密的私钥 blob。

  • 完成后,解密的私钥 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 循环生成将包括:
  • First MD5 Hash:IV的前8个字节和Passphrase的MD5哈希
  • 所有其他 MD5 Hashes 是最后一个 MD5 哈希结果和 IV 的前 8 个字节和密码短语的 MD5 哈希

  • 请参阅 EVP_BytesToKey 的 openssl 源代码 key 位生成示例的方法。
    现在可以使用上面的 IV 和 KEY 构建使用所选的加密算法对加密的私钥 blob 进行解码。

    关于检查 SSH 私钥是否加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57655324/

    相关文章:

    c - memset 设置字符指针 NULL/Garbage

    检查特定的命令行参数,然后将它们分配给变量

    macos - 如何仅从 NSS 构建 certutil?

    ios - 有没有办法让自定义表格 View 单元格看起来像 Xcode 6+ 中的按钮?

    swift - 将音频播放器添加到SceneKit中的节点

    linux - 在 Linux 或 MacOS X 中将 20141207_190822.jpg 等文件重命名为 "2014-12-07 19.08.22.jpg"

    python - 当我在终端中输入 'python -V' 时...为什么我看到 Python 2.7.10

    c - 以用户身份安装 Clang(无根权限)?

    c - 函数名作为 C 中 main 的参数

    ios - 在 Swift 3 的值类型中访问 Objective-C 类别的属性(相关引用)