如何保证WebAPI的安全?
1、JWT加密解密。token
2、使用https传输协议。
3、把用户所有请求的参数信息加上一个只有服务器端知道的secret,做个散列运算,然后到了服务器端,服务器端也做一个散列运算。如果散列值是一样的,那就表示没被篡改。
4、在业务逻辑上进行保护。(检查访问者是否有权限来实现一些操作。这点是最主要的,前面3的未必能够100%保证安全)

JWT由三部分组成(Header,Payload,Signature),可以把用户名、密码等保存到Payload部分。

Header:base64enc({ "alg":"HS256","TYPE":"JWT"})  // eyAiYWxnIjoiSFMyNTYiLCJUWVBFIjoiSldUIn0=

Payload:base64enc({"user":"vichin","pwd":"weichen123"})  //用户的关键信息 eyJ1c2VyIjoidmljaGluIiwicHdkIjoid2VpY2hlbjEyMyJ9

Signature:HMACSHA256(base64enc(header)+","+base64enc(payload),secretKey)

Header和Payload部分使用的是Base64编码,几乎等于明文,Signature部分是根据header+payload+secretKey进行加密算出来的,如果Payload被篡改,就可以根据Signature解密时候校验。

首先需要添加引用

install-package JWT (3.0.1支持 .net framework 3.5,3.0.2需要.net 4.6.2)。

        public void AddSecret()
{
double exp = (DateTime.UtcNow.AddSeconds() - new DateTime(, , )).TotalSeconds;//10秒过期
var payload = new Dictionary<string, object>
{
{"UserID",},
{"UserName","admin"},
{ "exp",exp}//过期时间的key必须叫exp
};
string secret = "";//不能泄露的key
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serialer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serialer, urlEncoder);
string token = encoder.Encode(payload, secret);
textBox1.Text = token;
}
        public void SubSecret(string token)
{
//string token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySUQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.OR0lZOfbQr7D2wnY_m44tX9DOoNmDWV-6X53_ZZGJAs";
var secret = ""; //不能泄露的key
try
{
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
var json = decoder.Decode(token, secret, verify: true);
}
catch (TokenExpiredException)
{
MessageBox.Show("Token has expired");
}
catch (SignatureVerificationException)
{
MessageBox.Show("签名验证失败,数据可能被篡改");
}
}

最新文章

  1. Java注解和代理实现
  2. Unity3D-坐标转换笔记
  3. LBS上传到百度地图
  4. jquery extend中
  5. HDU 2845 Beans (DP)
  6. LoadRunner11_录制Oracle数据库脚本
  7. Android长按事件和点击事件问题处理,OnItemLongClickListener和OnItemClickListener冲突问题
  8. abp中文件下载,将内存数据导出到Excel并下载
  9. Dynamics 365 Online用户密码三问及其解答
  10. DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果
  11. Python之PIL库的运用、GIF处理h
  12. spring入门——applicationContext与BeanFactory的区别
  13. Python 入门基础5 --元组、字典、集合
  14. A+B+C问题
  15. Codeforces 799B - T-shirt buying(STL)
  16. vue.js 源代码学习笔记 ----- core lifecycle
  17. 格式化JavaScript代码
  18. (8)go 字符串
  19. 码云平台, Git提交需要输入用户名/密码, 怎么办
  20. Redis搭建(一):单实例

热门文章

  1. js之数据类型(对象类型——单体内置对象——Math)
  2. STM32点亮LED
  3. Vue介绍:vue导读2
  4. 关于单例模式getInstance()的使用
  5. java—多线程—notify/notifyAll
  6. c#使用 StackExchange.Redis 封装 RedisHelper
  7. 【线段树 矩阵乘法dp】8.rseq
  8. 19-SQLServer定期自动导入数据的dtsx部署
  9. P3254——DP&amp;&amp;入门
  10. Linq 分组查询