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

本文关键字:文件 证书 APK 中对 何验证 验证 用于 | 更新日期: 2023-09-27 18:31:32

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

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

"哈希"是签名文件 (SF) 的 sha1 摘要,vData 是签名的加密哈希 (CMSG_ENCRYPTED_DIGEST,),两者都是字节数组。

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

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

X509 证书使用两种可能不一致的算法(SignatureAlgorithm.FriendlyName 和 PublicKey.Key.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));
                        }