接口加密方法(实际上也就是参数加密)

来源:互联网 发布:mac用了vpn后 不能上网 编辑:程序博客网 时间:2024/06/05 06:28

接口加密听起来高大上  ,然而实际上确实将需要传递的参数 与特定的标识key以及其他的固定的属性来组合成一个字符串或者集合传递给对方


对方再通过特定的key特定的属性去解密传过来的字符串或者集合,从而获取传过来的参数或者结果集


这里重要的便是 这些固定的key或者属性是不能够泄密的


废话少说 ,上代码供看管审查:


项目传递参数的时候类型大多数都是以map 或者字符串或者json来传递的,这里以map为例

定义一个map集合


Map<String, String> paramMap = new HashMap<String, String>();


向map集合中添加我们的请求参数


paramMap .put("requestKey","123");//  requestKey 为请求对方接口的固定参数名称 当然可能不止一个,其余的直接加上便是


组装map集合,形成加密map集合,传递:


map.put("ctime", (System.currentTimeMillis()/1000)+"");//当前系统时间戳
map.put("nonce", RandomStringUtils.randomAlphanumeric(32));//随机数
map.put("key", CommonConstants.KEY);//约定的key  约定的key只有双方知道 ,这里是不对外暴露的
map.put("sign",SHA.sha(MapUtil.createSortStr(new ArrayList<String>(map.values()))));//签名   签名是通过特定的算法来的 现在算法网上很多
map.remove("key");//移除约定的key  移除key的目的是对方要通过他们key来解析这个map集合,解析通过才能获取到请求参数或者返回结果集

这里说明下 SHA.sha() 方法

SHA.sha(MapUtil.createSortStr(new ArrayList<String>(map.values())))


MapUtil.createSortStr(new ArrayList<String>(map.values()))


这里是map工具类转化工作

new ArrayList<String>(map.values())  首先将map集合中value转为list类型

/**
     * 对集合字典排序
     * @param list
     * @return
     */
    public static String createSortStr(List<String> list){
    Collections.sort(list);
    // 注意:是根据的汉字的拼音的字母排序的,而不是根据汉字一般的排序方法  这里只是简单的一种 其他的可以双方协定自己定义
    String sortStr = "";
    for(int i=0;i<list.size();i++){
    sortStr = sortStr + list.get(i);
    }
    return sortStr;
    }

字符串加密方法   sha


/** 
* 字符串 SHA 加密 
*  
* @param strSourceText 
* @return 
*/  
public static String sha(final String strText){  
// 返回值  
String strResult = null;  


// 是否是有效字符串  
if (strText != null && strText.length() > 0)  
{  
try  
{  
// SHA 加密开始  
// 创建加密对象 并傳入加密類型  
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");  
// 传入要加密的字符串  
messageDigest.update(strText.getBytes());  
// 得到 byte 類型结果  
byte byteBuffer[] = messageDigest.digest();  


// 將 byte 轉換爲 string  
StringBuffer strHexString = new StringBuffer();  
// 遍歷 byte buffer  
for (int i = 0; i < byteBuffer.length; i++)  
{  
String hex = Integer.toHexString(0xff & byteBuffer[i]);  
if (hex.length() == 1)  
{  
strHexString.append('0');  
}  
strHexString.append(hex);  
}  
// 得到返回結果  
strResult = strHexString.toString();  
}  
catch (NoSuchAlgorithmException e)  
{  
e.printStackTrace();  
}  
}  
return strResult;  


这里简单以sha256方式加密  


这样  签名sgin便获取到了  ,然后将key移除


对方获取的时候便要匹配这个签名sign的值  ,因为map里面没有key 所以要根据事先约定的key来解析这个签名


解析方法同理:map集合加上key后 再生成一个sign签名 ,然后拿着这个签名跟借用接口传过来的map集合中的签名去匹配 ,通过即可运行,不通过便返回签名错误


这里加密方式  是以sha256方式来计算的


到这里基本上接口加密已经完成了 ,接口的安全性在不暴露的情况下还是可以防止


弊端:  key的泄露

而且key不能一直保持不变,而是通过一直特定的规律去变化,特定的时间特定的值


当然这里省略了一部分 ,是无关紧要的 ,理解这个流程即可,毕竟每个公司的接口加密都是不一样的 



阅读全文
0 0
原创粉丝点击