2

我正在尝试在 iOS(Swift)和 macOS(终端和 OpenSSL)上计算公钥的哈希值,但是两个平台都以稍微不同的格式导出密钥。

我的 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 将是相同的?

4

1 回答 1

0

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

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

这为 iOS 和 macOS 提供了相同的摘要

于 2021-08-04T07:03:55.730 回答