如何獲取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
2. 將得到的字符串后面追加上對應的Secret Key
3. 執行MD5運算,得到的32位字串即為sig參數的值
例如,如果調用URL是http://www.deathrowspeaks.net/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.deathrowspeaks.net/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];
}
}