用最简单方法解决api接口安全问题,几乎无法破解
2019年1月01日 11:45
场景描述
项目需要为第三方提供api服务接口。接口涉及到核心功能,如何保证接口安全。防止伪造身份、篡改数据?
思路
1 2 3 4 5 6 7 | 保障数据安全最好的方法,当然是加密了。无法解析内容,自然无法伪造,篡改。 可是使用https证书需要收费的。有其它方法么? 有的。 消息哈希认证(hmac)。 |
算法描述
* 访问者
1 2 3 | 1. 当访问接口时, 将参数按key值排序,组成key1=value1&key2=value2&....&secret_key=... 2. 然后对上面结果做md5,生成签名sign 3. 将sign放到加入请求的参数 |
* 被访问者
1 2 3 4 | 密钥是被访问者提供了,它也有访问者的secret_key. 1.根据app_id查到secret_key 2.处理请求参数,按规则组成key1=value1&key2=value2....&secret_key=... 3.对上一步结果做md5,生成sign。比较两个sign,相等则身份验证通过 |
效果
1. 密钥只存在双方机器上,不可能被截取
2. 签名无法伪造,同样身份无法伪造、消息无法被篡改
使用了hmac认证,接口被破解基本是不可能的
python实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import md5 app_id=123 secret_key= "xxxxxxxx" request_param = dict( key1= "value1" , key2= "value2" , key3= "value3" ) def sign(): params = [ "%s=%s" % (key, value) for key, value in sorted(request_param.items(), key=lambda item: item[0])] params.append( "secret_key=%s" % secret_key) str_param = "&" . join (params) print str_param md = md5.md5() md.update(str_param) return md.hexdigest() if __name__ == '__main__' : print(sign()) |
来源