WebAPi使用公钥私钥加密介绍和使用
随着各种设备的兴起,WebApi作为服务也越来越流行。而在无任何保护措施的情况下接口完全暴露在外面,将导致被恶意请求。最近项目的项目中由于提供给APP的接口未对接口进行时间防范导致短信接口被怒对造成一定的损失,临时的措施导致PC和app的防止措施不一样导致后来前端调用相当痛苦,选型过oauth,https,当然都被上级未通过,那就只能自己写了,就很,,ԾㅂԾ,,。下面就此次的方式做一次记录。最终的效果:传输过程中都是密文,别人拿到请求串不能更改请求参数,通过接口过期时间防止同一请求串一直被调用。
第一步重写MessageProcessingHandler中的ProcessRequest和ProcessResponse
无论是APi还是Mvc请求管道都提供了我们很好的去扩展,本次说的是api,其实mvc大概意思也是差不多的。我们现在主要写出大致流程

从图中可以看出我们需要在MessageProcessingHandlder上做处理。我们继承MessageProcessingHandlder重写ProcessRequest和ProcessResponse方法,从方法名可以看出一个是针对请求值处理,一个是针对返回值处理代码如下:
1 public class CustomerMessageProcesssingHandler : MessageProcessingHandler
2 {
3 protected override HttpRequestMessage ProcessRequest(HttpRequestMessage request, CancellationToken cancellationToken)
4 {
5 var contentType = request.Content.Headers.ContentType;
6
7 if (!request.Headers.Contains("platformtype"))
8 {
9 return request;
10 }
11 //根据平台编号获得对应私钥
12 string privateKey = Encoding.UTF8.GetString(Convert.FromBase64String(ConfigurationManager.AppSettings["PlatformPrivateKey_" + request.Headers.GetValues("platformtype").FirstOrDefault()]));
13 if (request.Method == HttpMethod.Post)
14 {
15 // 读取请求body中的数据
16 string baseContent = request.Content.ReadAsStringAsync().Result;
17 // 获取加密的信息
18 // 兼容 body: 加密数据 和 body: sign=加密数据
19 baseContent = Regex.Match(baseContent, "(sign=)*(?<sign>[\\S]+)").Groups[2].Value;
20 // 用加密对象解密数据
21 baseContent = CommonHelper.RSADecrypt(privateKey, baseContent);
22 // 将解密后的BODY数据 重置
23 request.Content = new StringContent(baseContent);
24
2041



被折叠的 条评论
为什么被折叠?



