开发一份API接口,需要注意这些,看你做到了几项
在实际工作中,我们需要经常跟外部三方系统打交道,可能会提供API接口给外部三方系统调用。
API接口通常通过WebController来实现。如果设计一个优雅的API接口,能够满足安全性、稳定性、易维护等多方面需求呢?
下面几项,看你做到了哪些。
1. 数字签名
为了防止API接口中的数据被篡改,我们需要对接口做签名。签名密钥由请求方和提供方互存,不参与网络传输。
接口请求方将请求参数 + 时间戳 + 密钥拼接成一个字符串,然后通过md5等hash算法,生成一个签名sign。
然后在请求参数或者请求头中,增加sign参数,上送给API接口。
API接口的网关服务,获取到该sign值,然后用相同的请求参数 + 时间戳 + 密钥拼接成一个字符串,用相同的m5算法生成另外一个sign,对比两个sign值是否相等。
如果两个sign相等,则认为是有效请求,API接口的网关服务会将给请求转发给相应的业务系统;如果两个sign不相等,则API接口的网关服务会直接返回签名错误。
BTW,提个问题:签名中为什么要加时间戳?
答:为了安全性考虑。一来,通过不同的时间戳,可以有效减少签名相同的概率。二来,API接口的网关服务可以校验时间戳,与服务器当前时间是否吻合(实际生产中会容许几秒的差异),不吻合就直接返回非法请求。
目前生成数字签名的密钥有3种形式:
一种是双方约定一个固定值privateKey。
另一种是API接口提供方给出AK/SK两个值,双方约定用SK作为签名中的密钥。AK接口调用方作为header中的accessKey传递给API接口提供方,这样API接口提供方可以根据AK获取到SK,而生成新的sgin。
第3种是使用非对称加密算法生成签名,常见的是RSA。RSA包含一对公私钥,其中一方保留自己的私钥,并将公钥提供给另一方。调用方发起API请求时通过私钥加签,另一方则通过其公钥验签。
我们可以使用在线工具生成密钥对:https://tools.ytdevops.com/rsa-key-pair-generator
2. 敏感数据处理
有些时候,我们的API接口会直接传递非常重要的数据,比如:用户的登录密码、银行卡号、手机号、用户身份证等,将这些参数直接明文暴露到公网上是非常危险的事情,很容易造成用户隐私数据泄露。
这些用户隐私数据被称作敏感数据。那么,针对敏感数据,API设计上我们怎么做呢?
一句话:对于交易类接口,涉及敏感数据的,做加密处理。对于非交易类接口,涉及敏感数据的,考虑做脱敏处理。当然,还有一个原则是,非需不返回用户隐私数据。
敏感数据加密
数据加密通常使用对称加密算法。如AES、DES、3DES。双方互存加密秘钥encryptKey。一方利用encryptKey加密,另一方利用encryptKey解密。
当然,也可以对数据进行RSA非对称加密。调用方利用API提供方的公钥对数据加密,API提供方则利用自己的私钥对数据解密。
需要指出的是,无论是RSA加密还是RSA签名,服务提供方的公私钥只有一份,而不同的外部三方系统应持有不同的公私钥。
另外,对于用户敏感数据,服务提供方在合法合规的前提下,应做加密存储,而不是直接明文存储。
敏感数据脱敏
为保护用户隐私,用户的敏感信息经常要做脱敏处理。尤其在支付系统或金融系统,数据安全是第一要务,数据的脱敏处理更是必选项。
数据脱敏,指的是将用户敏感数据的一部分字符用特殊字符作为掩码来表示。
[*]【身份证号脱敏示例】110115201406180712 脱敏后:110115********0712
[*]【银行卡号脱敏示例】9558820200019833888 脱敏后:955882*********3888
[*]【手机号脱敏示例】18810754438 脱敏后:188******38
这样即使数据被泄露了,也只泄露了一部分,不法分子拿到这份数据也没啥用。
算法实现原理很简单,就是保留头尾字符,把中间的部分用特殊字符如星号“*”作为掩码来表示。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]