zoukankan      html  css  js  c++  java
  • 接入GoogelAdmob C#服务器端验证 (SSV) 回调

    记一次接入谷歌广告验证
    官方文档:https://developers.google.cn/admob/android/rewarded-video-ssv
    需要httpserver进行验证,项目里有httpserver,因此通过将服务端ip端口绑定域名的方法进行验证回调。
    验证回调:在官网添加应用了可以添加回调网址进行验证
    
    加密使用的是ECDSA,c#解决方案参考:https://stackoverflow.com/questions/61659891/c-sharp-signature-verification-using-ecdsa-with-sha256-certificate
    
    获取公钥网址:http://www.gstatic.com/admob/reward/verifier-keys.json
    获得的json格式如下:{"keys":[{"keyId":3335741209,"pem":"-----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+nzvoGqvDeB9+SzE6igTl7TyK4JB
    bglwir9oTcQta8NuG26ZpZFxt+F2NDk7asTE6/2Yc8i1ATcGIqtuS5hv0Q==
    -----END PUBLIC KEY-----","base64":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+nzvoGqvDeB9+SzE6igTl7TyK4JBbglwir9oTcQta8NuG26ZpZFxt+F2NDk7asTE6/2Yc8i1ATcGIqtuS5hv0Q=="}]}
    pem和base64都可以进行验证,但需要转化成统一格式
    
    验证过程:
                var pubkeyString =
    @"-----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+nzvoGqvDeB9+SzE6igTl7TyK4JBbglwir9oTcQta8NuG26ZpZFxt+F2NDk7asTE6/2Yc8i1ATcGIqtuS5hv0Q==
    -----END PUBLIC KEY-----";
                var pemreader = new PemReader(new StringReader(pubkeyString));
                var pubkey = (AsymmetricKeyParameter)pemreader.ReadObject();
    
                var data = "ad_network=5450213213286189855&ad_unit=1234567890&custom_data=106&reward_amount=1&reward_item=Reward&timestamp=1621586055036&transaction_id=123456789&user_id=11111";
                StringBuilder signature = new StringBuilder();
                signature.Append("MEYCIQCaRAEhqLlOBwSHrlNcZyunYROD3xIMROOD+zAamwlFDwIhANDRk9qXfAZg/BCLslzmqy2PFXk3fr3tQjaEqqSdaRyP");
                //对base64格式化,替换和补位
                signature = signature.Replace('-', '+').Replace('_', '/');
                int remainder = signature.Length % 4;
                if(remainder > 0)
                {
                    signature.Append('=', 4 - remainder);
                }
                var signatureBytes = Convert.FromBase64String(signature.ToString());
    
                // Verify using the public key
                var signer = SignerUtilities.GetSigner("SHA-256withECDSA");
                signer.Init(false, pubkey);
                signer.BlockUpdate(Encoding.UTF8.GetBytes(data), 0, data.Length);
                var success = signer.VerifySignature(signatureBytes);
    
                if (success)
                {
                    Console.WriteLine("Signature verified successfully using public key");
                }
                else
                {
                    Console.WriteLine("Failed to verify signature using public key");
                }
     附上可验收上述代码的,可以根据算法在线生成公钥私钥、加密数据、验证签名的网址:https://8gwifi.org/ecsignverify.jsp
  • 相关阅读:
    抽象类和接口
    回调函数
    Spring Aop、拦截器、过滤器的区别
    事务
    SQL 模糊查询条件的四种匹配模式
    shell编程(二)
    shell编程(一)
    shell介绍
    字符验证码
    selenium
  • 原文地址:https://www.cnblogs.com/darkif/p/14804467.html
Copyright © 2011-2022 走看看