我正在尝试在 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 将是相同的?