接口加密方法(实际上也就是参数加密)
来源:互联网 发布: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不能一直保持不变,而是通过一直特定的规律去变化,特定的时间特定的值
当然这里省略了一部分 ,是无关紧要的 ,理解这个流程即可,毕竟每个公司的接口加密都是不一样的
- 接口加密方法(实际上也就是参数加密)
- 接口请求之加密参数(用户名和密码),使用md5方法加密
- url参数加密方法
- JS的md5加密方法 和 PHP的md5加密方法,加密同一字符串,表面上得到的是一样的值,实际上不一样!!
- 对接口参数进行加密调用接口获取信息
- thinkphp U 方法加密传参数
- 加密url,加密字符串,加密参数
- MD5 加密 参数加密解密
- 加密方法
- 加密方法
- 加密方法
- 加密方法
- 加密方法
- 加密方法
- Jmeter接口测试工具二次开发(转)(主要是参数加密传输)
- 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)
- jmeter完成md5加密的接口请求参数
- jmeter完成md5加密的接口请求参数
- leetcode:494. Target Sum
- Maven的安装和在Eclipse中的配置
- Example of red5-client
- 博客开启,学习之路起航,2017/5/17,大四下
- navigationcontroller在push新的viewcontroller时出现画面卡顿
- 接口加密方法(实际上也就是参数加密)
- Android Studio导入项目非常慢的解决办法
- 记一次服务器被攻击处理
- 操作系统(Operating System)3
- 安卓双向范围取值选择器,双向选择进度条,单向选择进度条自定义视图View实现
- 算法竞赛入门经典 例题8-12 奇怪的气球膨胀 Erratic Expansion uva12627
- 关于camera calibration以后三维空间和二维图像之间的映射关系
- SurfStat Toolbox 使用说明
- 加上事务aop后项目启动报错解决方法参考