api接口数据安全(api接口数据安全吗)

4747 380 2022-11-13


本文目录一览:

如何写出安全的API接口

1.完全开放的接口

有没有这样的接口,谁都可以调用,谁都可以访问,不受时间空间限制,只要能连上互联网就能调用,毫无安全可言。

实话说,这样的接口我们天天都在接触,你查快递,你查天气预报,你查飞机,火车班次等,这些都是有公共的接口。

我把这称之为裸奔时代。代码如下:

/// summary

/// 接口对外公开

/// /summary

/// returns/returns

[HttpGet]

[Route("NoSecure")]

public HttpResponseMessage NoSecure(int age)

{

var result = new ResultModelobject()

{

ReturnCode = 0,

Message = string.Empty,

Result = string.Empty

};

var dataResult = stulist.Where(T = T.Age == age).ToList();

result.Result = dataResult;

return GetHttpResponseMessage(result);

}

2.接口参数加密(基础加密)

你写个接口,你只想让特定的调用方使用,你把这些调用的人叫到一个小屋子,给他们宣布说我这里有个接口只打算给你们用,我给你们每人一把钥匙,你们用的时候拿着这把钥匙即可。

这把钥匙就是我上文说到的参数加密规则,有了这个规则就能调用。

这有安全问题啊,这里面的某个成员如果哪个不小心丢了钥匙或者被人窃取,掌握钥匙的人是不是也可以来掉用接口了呢?而且他可以复制很多钥匙给不明不白的人用。

相当于有人拿到了你的请求链接,如果业务没有对链接唯一性做判断(实际上业务逻辑通常不会把每次请求的加密签名记录下来,所以不会做唯一性判断),就会被重复调用,有一定安全漏洞,怎么破?先看这个场景的代码,然后继续往下看!

/// summary

/// 接口加密

/// /summary

/// returns/returns

[HttpGet]

[Route("SecureBySign")]

public HttpResponseMessage SecureBySign([FromUri]int age, long _timestamp, string appKey, string _sign)

{

var result = new ResultModelobject()

{

ReturnCode = 0,

Message = string.Empty,

Result = string.Empty

};

#region 校验签名是否合法

var param = new SortedDictionarystring, string(new AsciiComparer());

param.Add("age", age.ToString());

param.Add("appKey", appKey);

param.Add("_timestamp", _timestamp.ToString());

string currentSign = SignHelper.GetSign(param, appKey);

if (_sign != currentSign)

{

result.ReturnCode = -2;

result.Message = "签名不合法";

return GetHttpResponseMessage(result);

}

#endregion

var dataResult = stulist.Where(T = T.Age == age).ToList();

result.Result = dataResult;

return GetHttpResponseMessage(result);

}

3.接口参数加密+接口时效性验证(一般达到这个级别已经非常安全了)

继上一步,你发现有不明不白的人调用你的接口,你很不爽,随即把真正需要调用接口的人又叫来,告诉他们每天给他们换一把钥匙。和往常一样,有个别伙伴的钥匙被小偷偷走了,小偷煞费苦心,经过数天的踩点观察,准备在一个月黑风高的夜晚动手。拿出钥匙,捣鼓了半天也无法开启你的神圣之门,因为小偷不知道你天天都在换新钥匙。

小偷不服,经过一段时间琢磨,小偷发现了你们换钥匙的规律。在一次获得钥匙之后,不加思索,当天就动手了,因为他知道他手里的钥匙在第二天你更换钥匙后就失效了。

结果,小偷如愿。怎么破?先看这个场景的代码,然后继续往下看!

/// summary

/// 接口加密并根据时间戳判断有效性

/// /summary

/// returns/returns

[HttpGet]

[Route("SecureBySign/Expired")]

public HttpResponseMessage SecureBySign_Expired([FromUri]int age, long _timestamp, string appKey, string _sign)

{

var result = new ResultModelobject()

{

ReturnCode = 0,

Message = string.Empty,

Result = string.Empty

};

#region 判断请求是否过期---假设过期时间是20秒

DateTime requestTime = GetDateTimeByTicks(_timestamp);

if (requestTime.AddSeconds(20)  DateTime.Now)

{

result.ReturnCode = -1;

result.Message = "接口过期";

return GetHttpResponseMessage(result);

}

#endregion

#region 校验签名是否合法

var param = new SortedDictionarystring, string(new AsciiComparer());

param.Add("age", age.ToString());

param.Add("appKey", appKey);

param.Add("_timestamp", _timestamp.ToString());

string currentSign = SignHelper.GetSign(param, appKey);

if (_sign != currentSign)

{

result.ReturnCode = -2;

result.Message = "签名不合法";

return GetHttpResponseMessage(result);

}

#endregion

var dataResult = stulist.Where(T = T.Age == age).ToList();

result.Result = dataResult;

return GetHttpResponseMessage(result);

}

4.接口参数加密+时效性验证+私钥(达到这个级别安全性固若金汤)

继上一步,你发现道高一尺魔高一丈,仍然有偷盗事情发生。咋办呢?你打算下血本,给每个人配一把钥匙的基础上,再给每个人发个暗号,即使钥匙被小偷弄去了,小偷没有暗号,任然无法如愿,而且这样很容易定位是谁的暗号泄漏问题,找到问题根源,只需要给当前这个人换下钥匙就行了,不用大动干戈。

但这个并不是万无一失的,因为钥匙毕竟还有可能被小偷搞到。代码如下:

/// summary

/// 接口加密并根据时间戳判断有效性而且带着私有key校验

/// /summary

/// returns/returns

[HttpGet]

[Route("SecureBySign/Expired/KeySecret")]

public HttpResponseMessage SecureBySign_Expired_KeySecret([FromUri]int age, long _timestamp, string appKey, string _sign)

{

//key集合,这里随便弄两个测试数据

//如果调用方比较多,需要审核授权,根据一定的规则生成key把这些数据存放在数据库中,如果功能扩展开来,可以针对不同的调用方做不同的功能权限管理

//在调用接口时动态从库里取,每个调用方在调用时带上他的key,调用方一般把自己的key放到网站配置中

Dictionarystring, string keySecretDic = new Dictionarystring, string();

keySecretDic.Add("key_zhangsan", "D9U7YY5D7FF2748AED89E90HJ88881E6");//张三的key,

keySecretDic.Add("key_lisi", "I9O6ZZ3D7FF2748AED89E90ZB7732M9");//李四的key

var result = new ResultModelobject()

{

ReturnCode = 0,

Message = string.Empty,

Result = string.Empty

};

#region 判断请求是否过期---假设过期时间是20秒

DateTime requestTime = GetDateTimeByTicks(_timestamp);

if (requestTime.AddSeconds(20)  DateTime.Now)

{

result.ReturnCode = -1;

result.Message = "接口过期";

return GetHttpResponseMessage(result);

}

#endregion

#region 根据appkey获取key值

string secret = keySecretDic.Where(T = T.Key == appKey).FirstOrDefault().Value;

#endregion

#region 校验签名是否合法

var param = new SortedDictionarystring, string(new AsciiComparer());

param.Add("age", age.ToString());

param.Add("appKey", appKey);

param.Add("appSecret", secret);//把secret加入进行加密

param.Add("_timestamp", _timestamp.ToString());

string currentSign = SignHelper.GetSign(param, appKey);

if (_sign != currentSign)

{

result.ReturnCode = -2;

result.Message = "签名不合法";

return GetHttpResponseMessage(result);

}

#endregion

var dataResult = stulist.Where(T = T.Age == age).ToList();

result.Result = dataResult;

return GetHttpResponseMessage(result);

}

php开发api接口,如何做才算是安全的

这个问题很深

安全,不敢当,因为web安全问题很多,不仅仅是PHP编码而已,有很多安全上的问题需要做处理,像服务器漏洞、端口开放都会导致被黑,这都是很正常的。

只能说 比如在我做PHP开发过程的一些安全保护和在网络安全公司开发时的工作要求:

1、最基础的,提供的api接口 要配置https。

2、api返回响应的信息,要尽可能使用消息加密返回,如高位数的 rsa加密内容。

3、接收的回调开放接口,尽可能做到使用回调黑、白名单,如加ip白名单放行,或ip黑名单禁止访问。

4、不要相信用户输入、输入信息要进行编码转换、转义、过滤、使用框架和插件进行处理,如MySQL查询的要进行参数绑定、如显示问题要避免xss攻击会进行过滤。

5、授权操作,错误限制设置阀值、超过阀值限制访问、如最基础的登录功能。

6、常见额弱口令问题导致漏铜,应设置高强度口令,避免程序爆破。

7、文件上传问题、应严格校验文件类型、后缀、格式、及文件目录权限设置,从而避免文件上传漏洞导致恶意代码或webshell攻击。

8、开发环境和生产环境隔开,不要再生产上面开debug、及时更新使用框架漏洞补丁如PHP国内常用 tp系列以前偶尔爆出漏洞(我用的较多就是tp5 ....),还有框架不要用最新要选择最稳定的。

最后注意不管是验证还是过滤,在客户端执行过一次也好,在服务端,都要再次执行验证和校验。

和盛之文  我的文章保存网站,欢迎访问学习或参考


开放的API接口的安全性问题


其实我有个比较简单的方法。

APP调用后台接口的时候,把登陆APP的用户名和密码拼接到参数串里,用RSA公钥对参数串加密并传递给后台。后台接口在得到此参数后,用私钥解密并与数据库中的用户名密码进行比对,如果符合则说明是正常访问。

你觉得这样可行吗?

什么是签名?服务器和APP之间的API接口和数据怎么保证安全

用HTTPS通信另外APP往服务器接口发送参数带token要加签名服务器端验签名(防参数篡改)校验token;同加间戳防止重放(签名算、密钥配安全存储要设计)

服务器接口要监控监控异情况要处理案

什么是签名?服务器和APP之间的API接口和数据怎么保证安全?

accesstoken是一种方式,早期简单点的有appid,appkey方式,复杂一点的可以使用RSA加密。

服务器和APP直接大部分通过接口调用,比如用户列表。/user/list/

post到/user/list/里面有加密的一个token这个是验证是不是一个合法的访问者。而且现在很多开发平台比如微信。

开放平台API接口安全性设计——微信支付为例

API接口,类似 ;mch_id=123 ,这个请求我以商户mch_id=123的身份给订单号为order_id=123退款,如果服务器不辩别请求发起者的身份直接做相应的操作,那是及其危险的。

一般的,在PC端,我们是通过加密的cookie来做会员的辨识和维持会话的;但是cookie是属于浏览器的本地存储功能。APP端不能用,所以我们得通过token参数来辨识会员;而这个token该如何处理呢?

延伸开来,接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用。

一般来说,在前端对数据做加密或者前面,是不现实的。前后端使用HTTP协议进行交互的时候,由于HTTP报文为明文,所以通常情况下对于比较敏感的信息可以通过在前端加密,然后在后端解密实现"混淆"的效果,避免在传输过程中敏感信息的泄露(如,密码,证件信息等)。不过前端加密只能保证传输过程中信息是‘混淆’过的,对于高手来说,打个debugger,照样可以获取到数据,并不安全,所谓的前端加密只是稍微增加了攻击者的成本,并不能保证真正的安全。即使你说在前端做了RSA公钥加密,也很有可能被高手获取到公钥,并使用该公钥加密数据后发给服务端,所以务必认为前端的数据是不可靠的,服务端要加以辩别。敏感信息建议上https。

所以一般建议上https,敏感信息md5混淆,前端不传输金额字段,而是传递商品id,后端取商品id对应的金额,将金额等参数加签名发送到支付系统。金额可以是明文的。

token授权机制 :用户使用用户名密码登录后,后台给客户端返回一个token(通常是UUID),并将Token-UserId键值对存储在redis中,以后客户端每次请求带上token,服务端获取到对应的UserId进行操作。如果Token不存在,说明请求无效。

弊端 :token可以被抓包获取,无法预防MITM中间人攻击

用户每次请求都带上当前时间的时间戳timestamp,服务器收到请求后对比时间差,超过一定时长(如5分钟),则认为请求失效。时间戳超时机制是防御DOS攻击的有效手段。

将token,timestamp等其他参数以字典序排序,再加上一个客户端私密的唯一id(这种一般做在服务端,前端无法安全保存这个id)或使用私钥签名,将前面的字符串做MD5等加密,作为sign参数传递给服务端。

地球上最重要的加密算法:非对称加密的RSA算法。公钥加密的数据,可以用私钥解密;私钥签名(加密)的数据,可以用公钥验签。

RSA原理是对极大整数做因数分解,以下摘自维基百科。

暂时比较忙没时间,将于7月29日晚更新。

来更新啦。

微信支付安全规范,可以查看官方文档

第1点中,其签名算法最重要的一步,是在最后拼接了商户私密的API密钥,然后通过md5生成签名,这时即使金额是明文也是安全的,如果有人获取并修改了金额,但是签名字段他是无法伪造的,因为他无法知道商户的API密钥。当然,除了微信支付的拼接API生成签名的方法,我们也可以通过java自带的security包进行私钥签名。其中nonce随机字符串,微信支付应该做了校验,可以防止重放攻击,保证一次请求有效,如果nonce在微信支付那边已经存在,说明该请求已执行过,拒绝执行该请求。

阮一峰老师的博客-RSA算法原理:

维基百科:



版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:网关接口(19款吉普指南者的网关接口)
下一篇:api接口调用教程(API接口调用)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~