首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用c#验证安装验证回发SKAdnetwork?

如何使用c#验证安装验证回发SKAdnetwork?
EN

Stack Overflow用户
提问于 2020-08-27 16:29:41
回答 1查看 494关注 0票数 0

遵循完成此任务所需的文档:https://developer.apple.com/documentation/storekit/skadnetwork/verifying_an_install_validation_postback

根据您通过参数创建的UTF-8字符串,验证attribution-signature参数中Apple的signed值。使用苹果的公钥和使用椭圆曲线数字签名算法的SHA256散列。

在我们的回发中,我们收到这个测试Json:

代码语言:javascript
复制
{
 "version" : "2.0",
 "ad-network-id" : "com.example",
 "campaign-id" : 42,
 "transaction-id" : "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28",
 "app-id" : 525463029,
 "attribution-signature" : "MDYCGQCsQ4y8d4BlYU9b8Qb9BPWPi+ixk\/OiRysCGQDZZ8fpJnuqs9my8iSQVbJO\/oU1AXUROYU="
 "redownload": 1,
 "source-app-id": 1234567891
 "conversion-value": 20
}

apple提供了这个公钥:

代码语言:javascript
复制
MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEMyHD625uvsmGq4C43cQ9BnfN2xslVT5V1nOmAMP6qaRRUll3PB1JYmgSm+62sosG

我们正在尝试验证签名,但仍然有一个异常: System.Security.Cryptography.CryptographicException:‘参数不正确’。

代码语言:javascript
复制
    static void Main(string[] args)
    {
        string publickey = "MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEMyHD625uvsmGq4C43cQ9BnfN2xslVT5V1nOmAMP6qaRRUll3PB1JYmgSm+62sosG";
        var attribution_signature = "MDYCGQCsQ4y8d4BlYU9b8Qb9BPWPi+ixk/OiRysCGQDZZ8fpJnuqs9my8iSQVbJO/oU1AXUROYU=";
        string pars = getParamsSignature("2.0", "com.example", "42", "525463029", "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28", "1", "1234567891");

        VerifySignature(publickey, attribution_signature, pars);

    }


    // https://stackoverflow.com/questions/59078889/ecdsa-verify-signature-in-c-sharp-using-public-key-and-signature-from-java
    //0x30|b1|0x02|b2|r|0x02|b3|s
    // b1 = Length of remaining data
    //  b2 = Length of r
    //b3 = Length of s
    static void VerifySignature(string publicKey, string signature, string paramss)
    {
        byte[] publicKeyBytes = Convert.FromBase64String(publicKey);

        var signatureBytes = Convert.FromBase64String(signature); //30 49 30 13 06072a8648ce3d020106082a8648ce3d030101 03 32 00043321c3eb6e6ebec986ab80b8ddc43d0677cddb1b25553e55d673a600c3faa9a4515259773c1d496268129beeb6b28b06

        var data = Encoding.UTF8.GetBytes(paramss);

        var key = asn1_to_rs(publicKeyBytes);// "06072a8648ce3d020106082a8648ce3d03010100043321c3eb6e6ebec986ab80b8ddc43d0677cddb1b25553e55d673a600c3faa9a4515259773c1d496268129beeb6b28b06";


        CngKey cngKey = CngKey.Import(key, CngKeyBlobFormat.EccPublicBlob);
        ECDsaCng eCDsaCng = new ECDsaCng(cngKey);

        bool result = eCDsaCng.VerifyData(data, signatureBytes); 

    }

    static byte[] asn1_to_rs(byte[] asn)
    {

        var b1 = asn[1];
        var b2 = asn[3]; //  b2 = Length of r

        var r = asn.Skip(4).Take(b2);

        var b3 = asn[r.Count()];

        var s = asn.Skip(4 + b2 + 4).Take(b3);

        return r.Concat(s).ToArray();
    }

    static string getParamsSignature(string version, string ad_network_id, string campaign_id, string app_id, string transaction_id, string redownload, string source_app_id)
    {
        return (version + '\u2063' + ad_network_id + '\u2063' + campaign_id + '\u2063' + app_id + '\u2063' + transaction_id + '\u2063' + redownload + '\u2063' + source_app_id);
    }
EN

回答 1

Stack Overflow用户

发布于 2020-09-02 00:04:35

Apple says将重新下载值的"1“替换为"true”。

重新下载注意:使用字符串“true”或“false”表示重新下载参数的布尔值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63612103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档