在发送api的时候需要在header添加一个X-signature,需要使用 UUID 和 时间戳,使用HMAC,sha256方法进行加密。
查询的参考资料:
try {
String secret = "secret";// 加密使用的key
String message = "Message";// 需要加密的字符串(本项目是 "{uuid}_{timestamp}" )
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));// 重点
System.out.println(hash);
}
catch (Exception e){
System.out.println("Error");
}
}
这段代码需要apache的commons-codec包.
然后呢
在该链接里面找到 Android studio 使用的依赖
https://stackoverflow.com/questions/30259141/how-to-add-apache-commons-collections-in-android-studio-gradle
使用其中的
compile 'commons-codec:commons-codec:1.11'
本以为一切很顺利,但是 当程序跑起来之后,Crash了......
观察log,报的错误是 java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String
按照上面的方法是解决了 crash 的问题,但是在实际调试api的过程中 又出现了问题,使用代码生成的字符串和客户提供的工具网站生成的字符串还是不一样,
最会才发现
Base64.encodeToString(ecipher.doFinal(str.getBytes()),Base64.DEFAULT)
使用 encodeToString 还会对字符串进行二次加密(其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算法)Base64的链接
但是不需要,所有最后不使用Base64编码,直接将字节数组 转换成 字符串
private static String byteArrayToHexString(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b!=null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
hs.append('0');
hs.append(stmp);
}
return hs.toString().toLowerCase();
}
完整代码:
try {
String secret = "secret";// 加密使用的key
String message = "Message";// 需要加密的字符串(本项目是 "{uuid}_{timestamp}" )
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
String hash = byteArrayToHexString(sha256HMAC.doFinal(data.getBytes()));// 重点
System.out.println(hash);
}
catch (Exception e){
System.out.println("Error");
}
}