iOS 中如何加载 RSA-PSS 公钥?
2024-03-30 09:14:57
iOS 中使用 SecKeyCreateWithData 加载 RSA-PSS 公钥
问题:RSA-PSS 公钥加载失败
在 iOS 中使用 SecKeyCreateWithData()
加载使用 RSA-PSS 签名算法生成的公钥时,可能会遇到错误。这是因为使用 kSecAttrKeyTypeRSA
常量,它适用于标准 RSA 公钥,而对于 RSA-PSS 公钥,需要使用 kSecAttrKeyTypeRSASSA-PSS
常量。
解决方法:使用正确的密钥常量
要加载 RSA-PSS 公钥,需要在 createKey()
函数中将 kSecAttrKeyTypeRSA
替换为 kSecAttrKeyTypeRSASSA-PSS
:
func createKey(publicKeyData: Data, logPrefix: String) {
let attributes: [NSObject : NSObject] = [
kSecAttrKeyType: kSecAttrKeyTypeRSASSA-PSS, // 使用 RSA-PSS 公钥常量
kSecAttrKeyClass: kSecAttrKeyClassPublic,
]
}
数据类型:Base64、DER 和 ASN1
公钥可以从 Base64、DER 或 ASN1 数据加载。
- Base64: 从 Base64 编码的公钥字符串加载:
let publicKeyPEMBase64 = "YOUR_PUBLIC_KEY_IN_BASE64"
guard let publicKeyPEMData = Data(base64Encoded: publicKeyPEMBase64) else { return }
createKey(publicKeyData: publicKeyPEMData, logPrefix: "(1)")
- DER: 从 DER 编码的公钥数据加载:
let publicKeyDerRawBytes = [...YOUR_DER_ENCODED_PUBLIC_KEY...]
let publicKeyDerData = Data(publicKeyDerRawBytes)
createKey(publicKeyData: publicKeyDerData, logPrefix: "(2)")
- ASN1: 从 ASN1 编码的公钥数据加载:
let publicKeyAsn1RawBytes = [...YOUR_ASN1_ENCODED_PUBLIC_KEY...]
let publicKeyAsn1Data = Data(publicKeyAsn1RawBytes)
createKey(publicKeyData: publicKeyAsn1Data, logPrefix: "(3)")
结论
通过使用正确的密钥常量并根据数据类型加载公钥,可以在 iOS 应用中成功加载 RSA-PSS 公钥。
常见问题解答
1. 为什么使用不同的密钥常量?
不同的密钥常量对应不同的公钥算法。RSA-PSS 公钥使用 RSA-PSS 算法,因此需要使用 kSecAttrKeyTypeRSASSA-PSS
常量。
2. 为什么从不同数据类型加载公钥?
公钥可以使用不同的编码格式存储。Base64、DER 和 ASN1 都是常见的选择。
3. 如何获取 RSA-PSS 公钥?
可以使用 OpenSSL 等工具生成 RSA-PSS 公钥。命令可以是:
openssl genpkey -algorithm rsa-pss -pkeyopt rsa_keygen_bits:2048 -out your_public_key.pem
4. 使用 SecKeyCreateWithData() 加载公钥还有什么需要注意的吗?
确保公钥数据是有效的且未损坏。否则,加载可能会失败。
5. 除了加载公钥,使用 RSA-PSS 公钥还有什么其他用例?
RSA-PSS 公钥可用于验证 RSA-PSS 签名,这是数字签名的一种形式。