WebApi接口安全之用户认证防篡改数字签名(Data Sign)机制
WebApi接口安全之用户认证防篡改数字签名(Data Sign)机制
提交到WebApi接口的URL格式:
扫一扫加微信
一、用户认证
1.1 ApiKey-公钥认证
ApiKey给应用程序开发者分配的公钥(用户身份证,唯一标识, 明文传输),
提供给:平台的合作伙伴、供应商、客户等。
比如我们的WebApi服务器,要开放一个接口给合作伙伴使用,分配一个Apikey及SecretKey:
公钥(ApiKey):666888
私钥(SecretKey):6A02D19B-0397-497E-87EF-B4C826366666
有很多平台把ApiKey称作为partner(合作伙伴),接口参数用partner传递apikey。
当用户访问WebApi接口时,首先判断ApiKey是否存在。
1.2 SecretKey-私钥认证
用于数字签名(data sign),MD5加密。
私钥的特点:WebAPI接口不传输参数,公钥和私钥是1对1,一个公钥配对一个私钥。
二、接口参数防篡改、数字签名(Data Sign)机制
WebApi接口的数字签名用于接口数据安全以及用户认证防篡改。
防篡改,顾名思义就是防止有人恶意篡改请求数据以达到恶意攻击的目的。
2.1 基本原理
将请求的数据加上ApiKey(公钥)、SecreKey(私钥),按规则组织成一个字符串,获取对应的MD5摘要,然后将该摘要及公钥同时作为请求的参数一起传递(私钥禁止传递)给WebApi服务器。
2.2 签名与验签流程
2.2.1 客户端数字签名(MD5数据加密)
假设客户端要查询【订单】资料详情,提交的数据如下:
JSON Code:
{
"partner": "666888",
"orderNo": "1234567"
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
"partner": "666888",
"orderNo": "1234567"
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
partner: 伙伴编号,apikey
orderNo:订单编号
http://www.server.com/getOrder.aspx?partner=公钥&orderNo=业务数据&sign=MD5签名
URL实际内容:
http://www.server.com/getOrder.aspx?partner=666888&orderNo=1234567&sign=70611fd05dc0d39f6b4b470fc25218eb
MD5, 数据Sign算法:
MD5(partner+orderNo+私钥), MD5三个参数的值。
MD5(66688812345676A02D19B-0397-497E-87EF-B4C826366666)
MD5结果:70611fd05dc0d39f6b4b470fc25218eb
经data sign签名后,提交数据到WebApi接口的JSON:
JSON Code:
{
"partner": "666888",
"orderNo": "1234567"
"partner": "666888",
"orderNo": "1234567"
"sign":"70611fd05dc0d39f6b4b470fc25218eb"
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
//来源:C/S框架网 | www.csframework.com | QQ:23404761
2.2.2 服务端签名校验(Sign验签)
当WebApi服务器接收到客户端的请求(Request),首先通过请求的partner的值获取对应的私钥,然后通过上述签名算法计算MD5值,对比请求的sign参数与计算结果是否一致,若不一致,数据被篡改,或非法调用接口。
接收到的Request数据如下:
JSON Code:
{
"partner": "666888",
"orderNo": "1234567"
"partner": "666888",
"orderNo": "1234567"
"sign":"70611fd05dc0d39f6b4b470fc25218eb"
}
通过partner的值获取对应的私钥:
partner=666888, 从ApiKey缓存管理器得到私钥(SecretKey)的值:
6A02D19B-0397-497E-87EF-B4C826366666
计算签名,得出md5的值保存到sign变量中:
string sign=MD5(request.partner+request.orderNo+secretKey)
验签:
C# Code:
if (sign==request.sign)
{
//验签成功!执行下一个流程。
}else
{
//验签失败!返回操作结果。
}
{
//验签成功!执行下一个流程。
}else
{
//验签失败!返回操作结果。
}
CSFramework.WebApi后台验签:
C# Code:
if (SignEncryptMode.MD5 == mode)
dataEncrypt = CryptoHelper.ToMD5(apikey + data + secret + timestamp);
//签名不同,抛出异常
if (sign != dataEncrypt)
throw new ResponseException(ErrorCodes.DataSignFormatInvalide, ErrorCodes.DataSignFormatInvalide_Msg);
//来源:C/S框架网 | www.csframework.com | QQ:23404761
dataEncrypt = CryptoHelper.ToMD5(apikey + data + secret + timestamp);
//签名不同,抛出异常
if (sign != dataEncrypt)
throw new ResponseException(ErrorCodes.DataSignFormatInvalide, ErrorCodes.DataSignFormatInvalide_Msg);
//来源:C/S框架网 | www.csframework.com | QQ:23404761
ASP.NET WebApi快速开发框架|APP后端框架-标准版V1.0
适用开发:快速搭建APP、B/S、C/S、微信小程序、公众号、Web站点等后端应用服务程序。
运行平台:Windows + .NET Framework 4.5
开发工具:Visual Studio 2015+,C#语言
数据库:Microsoft SQLServer 2008R2+(支持多数据库:Oracle/MySql)
运行平台:Windows + .NET Framework 4.5
开发工具:Visual Studio 2015+,C#语言
数据库:Microsoft SQLServer 2008R2+(支持多数据库:Oracle/MySql)
CSFramework.WebApi框架:http://www.csframework.com/cs-framework-webapi-1.0.htm
扫一扫加微信
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网