接入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-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+nzvoGqvDeB9+SzE6igTl7TyK4JB\nbglwir9oTcQta8NuG26ZpZFxt+F2NDk7asTE6/2Yc8i1ATcGIqtuS5hv0Q==\n-----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×tamp=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
接入GoogelAdmob C#服务器端验证 (SSV) 回调的更多相关文章
- FineUI(开源版)v6.0中FState服务器端验证的实现原理
前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...
- SpringMVC 服务器端验证
1.导入JSR303验证类库Jar包2.在MVC的配置文件中添加<mvc:annotation-driven/>的配置3.在MVC的配置文件中添加验证器的配置4.在接收表单数据的类中添加验 ...
- jsf服务器端验证用户输入
服务器端验证用户输入数据步骤 1 html页面上插入要输入数据控件 <h:inputText size="10" value="#{commodityBean.fo ...
- jQuery html5Validate基于HTML5表单 异步服务器端验证
1. HTML5 自带的Validate 很漂亮,很好用, 但是一定要在form里用submit按钮,才生效 <form id="frmInfo" action=" ...
- 为 jquery validate 添加验证失败回调
转载自:https://blog.csdn.net/huang100qi/article/details/52619227 1. jquery Validation Plugin - v1.15.1 ...
- (十六)客户端验证与struts2中的服务器端验证
一.客户端验证: 即用javaScript来验证. <%@ page language="java" contentType="text/html; charset ...
- CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)
http://jyao.iteye.com/blog/1346547 注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF 入门: 远程接口调用方式实现 直入正题! 以下是服务端配置 ==== ...
- Spring Security 入门(3-11)Spring Security 的使用-自定义登录验证和回调地址
配置文件 security-ns.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...
- android客户端向服务器端验证登陆方法的实现2
一.在上一篇文章中,我只是提到了其中一种方法来实现登陆 大家可以参见: http://www.apkbus.com/android-45004-1-1.html android获取web服务 ...
- springboot内置tomcat验证授权回调页面域名
springboot内置tomcat验证公众号授权回调页面域名 解决方法: 网上下载一个tomcat,在server.xml文件中修改端口为springboot内置tomcat的端口号,复制验证文件到 ...
随机推荐
- 【学习笔记】C/C++ 设计模式 - 模板模式
介绍说明 模板设计模式是一种非常简单的设计模式,其主要是利用了虚函数的特性实现.非常适合应用在一些算法.流程.业务逻辑是固定的形式,其中某些步骤的实现方式又无法确定下来的场景. 举例说明 以下为模拟某 ...
- MRS_Debug仿真相关问题汇总
解决问题如下: Debug时,看不到外设寄存器选项 Debug时,更改变量显示类型 Debug时,断点异常 跳过所有断点 取消仿真前自动下载程序 Debug时仅擦除程序代码部分flash空间 保存De ...
- Pulsar负载均衡原理及优化
前言 前段时间我们在升级 Pulsar 版本的时候发现升级后最后一个节点始终没有流量. 虽然对业务使用没有任何影响,但负载不均会导致资源的浪费. 和同事沟通后得知之前的升级也会出现这样的情况,最终还是 ...
- 用Java写一个分布式缓存——RESP服务端
前言 本篇我们将完成一个RESP的socket的服务端,初步完成一个单机版缓存. 另外在其中我们还需要完成命令的动态路由 源码:https://github.com/weloe/Java-Distri ...
- SQL优化的七个方面
SQL优化的七个方面 1. 创建索引 禁止给表中每一列都建立单独索引 每个Innodb表都必须有一个主键 要注意组合索引的字段顺序 优先考虑覆盖索引 避免使用外键约束 2. 避免索引失效 失效场景: ...
- JavaScript原型和原型链?有什么特点?
一.原型 JavaScript 常被描述为一种基于原型的语言--每个对象拥有一个原型对象 当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上 ...
- 【Go并发编程】Goroutine的基本使用
goroutine是什么 goroutine即协程,使用go关键字开启一个协程异步执行代码. 注意,main函数也是个goroutine. 基本使用 使用go执行子任务,会交替执行(和时间片一样). ...
- LG P4168 [Violet]蒲公英
\(\text{Problem}\) 强制在线静态询问区间众数 \(\text{Solution}\) 不得不说 \(vector\) 是真的慢 做 \(LOJ\) 数列分块入门 \(9\) 卡时间卡 ...
- python 依据IP查找其所属网段
# coding = 'utf-8' # 依据excel表格中所提供的IP,在另一张表中查找其所属网段 import pandas as pd import IPy df = pd.read_exce ...
- ajax请求头添加参数
在请求ajax时 ,有时后台要求在请求头里边上参数 ,这种情况下一般都是在原生APP项目当中,因为要在登录状态下才,所有要传token和登录id, var token = localStorage.g ...