接口加密听起来高大上 ,然而实际上确实将需要传递的参数 与特定的标识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不能一直保持不变,而是通过一直特定的规律去变化,特定的时间特定的值
当然这里省略了一部分 ,是无关紧要的 ,理解这个流程即可,毕竟每个公司的接口加密都是不一样的