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

接口加密听起来高大上  ,然而实际上确实将需要传递的参数 与特定的标识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不能一直保持不变,而是通过一直特定的规律去变化,特定的时间特定的值


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



(*****************************************************)(* *)(* Advanced Encryption Standard (AES) *)(* Interface Unit v1.3 *)(* *)(* Readme.txt 自述文档 2004.12.04 *)(* *)(*****************************************************)(* 介绍 *)AES 是一种使用安全码进行信息加密的标准。它支持 128 位、192 位和 256 位的密匙。加密算法的实现在 ElAES.pas 单元中。本人将其加密方法封装在 AES.pas 单元中,只需要调用两个标准函数就可以完成字符串的加密和解密。(* 密匙长度 *)128 位支持长度为 16 个字符192 位支持长度为 24 个字符256 位支持长度为 32 个字符所有加密和解密操作在默认情况下为 128 位密匙。(* 文件列表 *)..Source AES 单元文件..Example 演示程序(* 适用平台 *)这份 Delphi 的执行基于 FIPS 草案标准,并且 AES 原作者已经通过了以下平台的测试: Delphi 4 Delphi 5 C++ Builder 5 Kylix 1本人又重新进行了补充测试,并顺利通过了以下平台: Delphi 6 Delphi 7特别说明: 在 Delphi 3 标准版中进行测试时,因为缺少 Longword 数据类型和 Math.pas 文件,并且不支持 overload 指示字,所以不能正常编译。(* 演示程序 *)这个示例程序演示了如何使用 AES 模块进行字符串的加密和解密过程。(* 使用方法 *)在程序中引用 AES 单元。调用函数 EncryptString 和 DecryptString 进行字符串的加密和解密。调用函数 EncryptStream 和 DecryptStream 进行流的加密和解密。调用过程 EncryptFile 和 DecryptFile 进行文件的加密和解密。详细参阅 Example 文件夹中的例子。(* 许可协议 *)您可以随意拷贝、使用和发部这个程序,但是必须保证程序的完整性,包括作者信息、版权信息和说明文档。请勿修改作者和版权信息。 这个程序基于 Mozilla Public License Version 1.1 许可,如果您使用了这个程序,那么就意味着您同意了许可协议中的所有内容。您可以在以下站点获取一个许可协议的副本。 http://www.mozilla.org/MPL/许可协议的发布基于 "AS IS" 基础,详细请阅读该许可协议。Alexander Ionov 是 AES 算法的最初作者,保留所有权利。(* 作者信息 *)ElAES 作者:EldoS, Alexander IonovAES Interface Unit 作者:杨泽晖 (Jorlen Young)您可以通过以下方式与我取得联系。WebSite: http://jorlen.51.net/ http://mycampus.03.com.cn/ http://mycampus.1155.net/ http://mycampus.ecoo.net/ http://mycampus.5500.org/Email: stanley_xfx@163.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值