iOS:使用证书和签名验证文件 – 公钥错误,验证失败

iOS:使用证书和签名验证文件 – 公钥错误,验证失败,第1张

概述我有三件事:文件,签名文件和X509证书文件.cer.必须使用证书中的公钥和签名文件验证该文件.我想用Security.h / CommonCrypto来做. 到目前为止我尝试了什么: // load all the filesNSData* fileData = [NSData dataWithContentsOfFile:(...)];NSData* signatureData = [NS 我有三件事:文件,签名文件和X509证书文件.cer.必须使用证书中的公钥和签名文件验证该文件.我想用Security.h / CommonCrypto来做.

到目前为止我尝试了什么:

// load all the filesNSData* fileData = [NSData dataWithContentsOffile:(...)];NSData* signatureData = [NSData dataWithContentsOffile:(...)];NSData* certificateData = [NSData dataWithContentsOffile:(...)];  SecCertificateRef certificate = SecCertificateCreateWithData(NulL,CFBrIDgingRetain(certificateData)); // load the certificate

证书加载就好了.它的名字可以使用

CFStringRef certificateDescription = SecCertificatecopySubjectSummary(certificate);

哪个有效.
由于iOS上似乎没有直接复制公钥的方法,我首先创建一个信任.

SecTrustRef trust;Osstatus statusTrust = SecTrustCreateWithCertificates( certificate,secPolicy,&trust);SecTrustResultType resultType;Osstatus statusTrustEval =  SecTrustEvaluate(trust,&resultType);

这一切都可以正常使用errSecSuccess结果.

现在我尝试获取公钥.

SecKeyRef publicKey;publicKey = SecTrustcopyPublicKey(trust);size_t keysize = SecKeyGetBlockSize(publicKey);

但是publicKey的内容

NSData* keyData = [NSData dataWithBytes:publicKey length:keysize];

与打开.cer文件时看到的公钥不同.所以这是第一个问题.

然后我尝试验证签名,即使我知道公钥是错误的.填充是正确的.

Osstatus verficationResult = SecKeyRawVerify(publicKey,kSecpaddingPKCS1,[fileData bytes],[fileData length],[signatureData bytes],[signatureData length]);

这失败,Osstatus为-9809( *** 作无法完成).我希望它是-25293 errSecAuthFailed.

我做了一些根本错误的事吗?

解决方法 我在 a hint from Apple Dev Forums的帮助下解决了这个问题.

这个问题与钥匙串无关.但我将错误的参数传递给验证功能.它需要数据的摘要(哈希),而不是数据直接.

NSData* fileData = [NSData dataWithContentsOffile:(...)];NSData* signatureData = [NSData dataWithContentsOffile:(...)];NSData* certificateData = [NSData dataWithContentsOffile:(...)];  SecCertificateRef certificateFromfile = SecCertificateCreateWithData(NulL,(__brIDge CFDataRef)certificateData); // load the certificateSecPolicyRef secPolicy = SecPolicyCreateBasicX509();SecTrustRef trust;Osstatus statusTrust = SecTrustCreateWithCertificates( certificateFromfile,&resultType);SecKeyRef publicKey = SecTrustcopyPublicKey(trust);uint8_t sha1HashDigest[CC_SHA1_DIGEST_LENGTH];CC_SHA1([fileData bytes],sha1HashDigest);Osstatus verficationResult = SecKeyRawVerify(publicKey,kSecpaddingPKCS1SHA1,sha1HashDigest,CC_SHA1_DIGEST_LENGTH,[signatureData length]);CFRelease(publicKey);CFRelease(trust);CFRelease(secPolicy);CFRelease(certificateFromfile);if (verficationResult == errSecSuccess) NSLog(@"VerifIEd");
总结

以上是内存溢出为你收集整理的iOS:使用证书和签名验证文件 – 公钥错误,验证失败全部内容,希望文章能够帮你解决iOS:使用证书和签名验证文件 – 公钥错误,验证失败所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1078529.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存