OpenSSL RSA public 密钥摘要

OpenSSL RSA public key digest

我正在尝试计算 iOS (Swift) 和 macOS(终端和 OpenSSL)上的 public 密钥的哈希值,但是这两个平台都将密钥导出到格式略有不同。

我的 Swift 代码提取包含模数和指数的序列(根据 Apple,这是 PKCS#1 容器)。

let export = SecKeyCopyExternalRepresentation(publicKey, nil)! as Data
let hash = SHA256.hash(data: export)
// SHA256 digest: 57fc8238c609045b7c0b546f58d5f797ebec4e39eff481459edfb67bd850834d
print(hash)

现在当我用终端做类似的事情时,我得到不同的输出。

openssl rsa -pubin -outform DER | openssl dgst -sha256                             
# writing RSA key
# 0ee9c99ef4ca3316e90dde23925bc9a670fa309d6f4663bb5d42050b5089b086

后者是由于 OpenSSL 将输出包装在结构更完整的 ASN.1 容器中。

SEQUENCE      (ASN.1 container)
  SEQUENCE
    OID       (RSA algorithm)
    NULL
  BITSTRING
    SEQUENCE  (iOS container)   
      INTEGER (Modulus)
      INTEGER (Exponent)

如何使用 OpenSSL 将密钥导出为 iOS 预期的序列,以便两个命令的 has 相同?

事实证明 OpenSSL 有一个未记录的参数 -RSAPublicKey_out 输出与 SecKeyCopyExternalRepresentation 相同的数据。

openssl rsa -pubin -RSAPublicKey_out -outform DER | openssl dgst -sha256

这为 iOS 和 macOS

提供了相同的摘要