安全性
- 用户名、口令认证
- 用户名、口令泄露,没有证书也无法完成认证
- 用户名、口令与证书绑定,用户、证书与硬件MAC地址绑定。
- 用户名、口令、证书均泄露后,若硬件MAC地址不在认证范围,则仍无法使用服务。
- 用户名、口令、证书泄露,盗用者通过解密获取MAC地址并伪造后,服务端仍可以通过修改配置实时变更认证MAC地址,甚至使证书失效。
需求&优点
需求
- 接口使用者无需知道接口地址和传输实现,仅需知道传入参数和传出传出数据的结构。
- 接口使用者必须拥有合法的用户名、口令以及证书。
- 接口使用者的项目中必须包含颁发给该使用者的证书,才能正常使用接口。
- 接口使用者通过口令和证书认证后获取到Token,然后通过Token调用其它功能接口。
优点
- 对接口使用者隐藏了接口的真实地址和实际调用传参规范。
- 使用证书认证,即使用户名和口令泄露,无证书的用户仍然无法使用接口功能。
- 证书可以限制接口使用者的使用权限有效时间。一旦证书过期,使用者将无法使用接口。
- 证书可以包含加密的额外认证信息,比如设备MAC地址认证信息等,这样即使证书和口令一起泄露,使用者仍然无法使用未经认证的机器来调用接口。服务端也可及时修改配置使泄露的证书失效。
使用者用法说明
对于使用者的个人项目而言,仅需引入接口调用工具库(假设为:dev-tool.jar)后即可使用。假设工具库中约定了如下元素:
1. 接口调用类HttpsClient。
2. 接口地址字典Endpoints。
2. 接口返回通用结构RespResult。
3. 错误码字典ResultState。
那么,用户仅需知道接口的名称即可通过类似如下的代码获取接口信息:
HashMap<String, Object>paramMap = new HashMap<String, Object>();
paramMap.put("paramName", "paramVale");
try {
RespResult res = HttpsClient.invoke(Endpoints.get("interfaceName"), paramMap);
if(res.statusId == ResultState.SUCCESS)
Object actualData = res.getData();
else
logger.error("interface return error:"+res.errMsg);
} catch (Exception e){
logger.error("httpsclient error:"+e)
}
整个调用过程中的接口地址、调用实现、调用传参的具体细节用户可以一概不管。
接口工具库设计
概述
接口工具是和接口服务对应的,因此又写代码应该与接口服务公用,比如接口返回的数据结构RespResult
以及错误字典ResultState
。其次,接口工具库不应该对外暴露太多方法,比如此处仅需暴露用户会使用到的invoke(String url, HashMap<String, Object> param)
方法即可。
证书验证
我们使用trueLicense来实现证书的验