java类函数默认的保护级别_事件说明
簽名算法/**
BodyToSign
1. 解析HTTP BODY:argsMap = parseForm
2. 對Form的參數key按照字典序升序排列,sortedArgs;
3. 遍歷sortedArgs:"&" + key + "=" + percentEncode("/")
*/
StringToSign = HTTP-Method + "&" + percentEncode("/") + bodyToSign;
Signature = Base64Encode(hmacSha1(AccessSecret + "&" + stringToSign));
/**
1. 讀取Request中除"IspSignature"參數外的所有參數。
2. 按照參數名稱的字典順序對參數進行排序。
3. 對每個請求參數的名稱和值進行編碼。名稱和值要使用UTF-8 字符集進行URL編碼,URL編碼的編碼規則是:
a. 對于字符 A-Z、a-z、0-9 以及字符“-”、“_”、“.”、“~”不編碼;
b. 對于其他字符編碼成 “%XY” 的格式,其中 XY 是字符對應 ASCII 碼的 16 進制表示。比如英文的雙引號 (”)對應的編碼就是 %22
4. 對于擴展的 UTF-8 字符,編碼成 “%XY%ZA...” 的格式。
5. 需要說明的是英文空格( )要被編碼是 %20,而不是加號(+)。
注:一般支持 URL 編碼的庫(比如 Java 中的 java.net.URLEncoder)都是按照 “application/x- www-form-urlencoded” 的 MIME 類型的規則進行編碼的。實現時可以直接使用這類方式進行編 碼,把編碼后的字符串中加號(+)替換成 %20、星號(*)替換成 %2A、%7E 替換回波浪號 (~),即可得到上述規則描述的編碼字符串。
1. 對編碼后的參數名稱和值使用英文等號(=)進行連接。
2. 再把英文等號連接得到的字符串按參數名稱的字典順序依次使用&符號連接,即得到規范化請求字符串。
*/Java版簽名實現Demoimport java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import javax.xml.crypto.dsig.SignatureMethod;
import org.apache.commons.codec.binary.Base64;
/**
* RPC簽名
*
* @return
* @throws UnsupportedEncodingException
*/
private String rpcSign(HttpServletRequest request)
throws Exception {
List keys = new ArrayList(request.getParameterMap().keySet());
Collections.sort(keys);
StringBuilder sb = new StringBuilder();
for (String key : keys) {
if (key.equals("IspSignature")){
continue;
}
String value = request.getParameter(key);
sb.append("&").append(percentEncode(key)).append("=").append(percentEncode(value));
}
StringBuilder stringToSign = new StringBuilder();
stringToSign.append(percentEncode(request.getMethod()));
stringToSign.append("&");
stringToSign.append(percentEncode("/"));
stringToSign.append("&");
stringToSign.append(percentEncode(sb.substring(1)));
SecretKey key = new SecretKeySpec(("YourSecretKey" + "&").getBytes("utf-8"), SignatureMethod.HMAC_SHA1);
Mac hmacSha1 = Mac.getInstance("HmacSHA1");
hmacSha1.init(key);
String sign = new String(new Base64().encode(hmacSha1.doFinal(stringToSign.toString().getBytes("utf-8"))),
"utf-8");
return sign;
}
/**
* 處理特殊字符
*
* @param s
* @return
* @throws UnsupportedEncodingException
*/
protected String percentEncode(String s) throws UnsupportedEncodingException {
if (s == null){
return null;
}
return URLEncoder.encode(s, "utf-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~");
}
總結
以上是生活随笔為你收集整理的java类函数默认的保护级别_事件说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java里面快速排序_Java:快速排序
- 下一篇: java绘制地球绕太阳转_Unity3D