如何验证用于在C#中对APK文件进行签名的链式证书

时间:2013-09-17 12:21:57

标签: c# cryptography rsa apk x509certificate

每次我传递一个具有认证链(中间和根CA)的APK文件时,此代码都会失败。如果文件是自签名的,则它可以正常工作。

RSACryptoServiceProvider csp = (RSACryptoServiceProvider)Cert.PublicKey.Key;
bool verified = csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), vData)

“hash”是签名文件(SF)的sha1摘要,vData是签名的加密哈希值(CMSG_ENCRYPTED_DIGEST,),都是字节数组。

1 个答案:

答案 0 :(得分:0)

我会在找到答案后回答我自己的问题。指定摘要方法时会出现问题。

X509证书使用两种可能不一致的算法(SignatureAlgorithm.FriendlyName和PublicKey.Key.SignatureAlgorithm)。验证哈希时,必须确保它与证书的SignatureAlgorithm匹配,而不是公钥中使用的算法(这是我的错)。

如有疑问,请同时检查:

                            if (cert.SignatureAlgorithm.FriendlyName.ToString().Contains("sha256"))
                        {
                            SHA256Managed sha256 = new SHA256Managed();
                            byte[] hash256 = sha256.ComputeHash(sig);
                            RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
                            verify_all.Add(csp.VerifyHash(hash256, CryptoConfig.MapNameToOID("SHA256"), vData));
                        }

                        else if (cert.SignatureAlgorithm.FriendlyName.ToString().Contains("sha1"))
                        {
                            SHA1Managed Sha1 = new SHA1Managed();
                            byte[] hash1 = sha1.ComputeHash(sig);                                
                            RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
                            verify_all.Add(csp.VerifyHash(hash1, CryptoConfig.MapNameToOID("SHA256"), vData));
                        }