如何获取UUID对应的Secret Key呢?您可以到“管理中心”页面,UUID右边有个钥匙图标,点击即可查看Secret内容:
说明:点击“钥匙”图标,查看Secret内容;Secret类似私钥,请不要随意泄露。
为了确保应用与bShare服务器之间的安全通信,防止Secret Key盗用,数据篡改等恶意攻击,bShare服务器使用了签名机制(即sig参数)来认证应用。签名是由请求参数和应用的私钥Secret Key经过MD5加密后生成的字符串。应用在调用bShare API之前,要计算出签名,并追加到请求参数中。sig参数生成方法如下:
1. 把所有参数按照字典顺排序后去掉连接符&,例如:c=3&a=1&b=2转换后为a=1b=2c=3
2. 将得到的字符串后面追加上对应的Secret Key
3. 执行MD5运算,得到的32位字串即为sig参数的值
例如,如果调用URL是http://www.bshare.cn/bsyncCustomizeEmbed,参数列表及Secret Key为:
uuid: f8a4a53f-438a-4ffa-939f-7f313a7e2b05
ts: 123456789
secret: 743ac9dd-68e0-4f6f-a3b1-a879fcfa3c7c
1. 经过第一步所有参数按照字典排序,以及第二步加上Secret Key成为:
ts=123456789uuid=f8a4a53f-438a-4ffa-939f-7f313a7e2b05743ac9dd-68e0-4f6f-a3b1-a879fcfa3c7c
2. 经过第三步执行MD5运算得到sig值:
MD5运算值:661e991ce887e29c16dc6d40214cd4ea
3. 最后调用iFrame的URL即为:
http://www.bshare.cn/bsyncCustomizeEmbed?uuid=f8a4a53f-438a-4ffa-939f-7f313a7e2b05&ts=123456789&sig=661e991ce887e29c16dc6d40214cd4ea
注意:计算sig值的所有参数字符串,必须用UTF-8编码,而且是在HTTP URLEncode之前。
View Sample Code
/**
* Encrypts the given string with MD5 and returns the result.
* This is used to authenticate bShare api calls.
*
* @param s
* @return
*/
public static String encryptForApi(Map<String, String> queryMap, String apiKeySecret) {
Set<String> kSet = queryMap.keySet();
if (kSet.contains(SIG_PARAM_NAME)) {
kSet.remove(SIG_PARAM_NAME);
}
List<String> sList = new ArrayList<String>(kSet);
Collections.sort(sList);
StringBuilder qs = new StringBuilder();
for (String k : sList) {
qs.append(k).append("=").append(queryMap.get(k));
}
qs.append(apiKeySecret);
return StringUtil.byteArrayToHexString(StringUtil.hash(qs.toString()));
}
/**
* Convert byte array into hex string
* @param bytes
* @return
*/
public static String byteArrayToHexString(byte[] bytes) {
if (bytes == null) {
return "";
}
StringBuffer b = new StringBuffer(bytes.length * 2);
for (int i = 0; i < bytes.length; ++i) {
int hex = bytes[i] & 0xFF;
b.append(K_HEX_CHARS.charAt(hex >> 4));
b.append(K_HEX_CHARS.charAt(hex & 0x0f));
}
return b.toString();
}
/**
* Hash the given string and return a byte array
* @param s
* @return
*/
public static byte[] hash(String s) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return md.digest(s.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e) {
return new byte[0];
} catch (UnsupportedEncodingException e) {
return new byte[0];
}
}