4.按照 Base64 编码规则编码成字符串,获取签名值。
public static String newStringByBase64(byte[] bytes)
throws UnsupportedEncodingException {
if (bytes == null || bytes.length == 0) {
return null;
}
return new String(new BASE64Encoder().encode(bytes));
}
public static String composeStringToSign(Map<String, String> queries) {
String[] sortedKeys = (String[]) queries.keySet()
.toArray(new String[0]);
Arrays.sort(sortedKeys);
StringBuilder canonicalizedQueryString = new StringBuilder();
for (String key : sortedKeys) { canonicalizedQueryString.append("&").append(percentEncode(key))
.append("=")
.append(percentEncode((String) queries.get(key)));
}
StringBuilder stringToSign = new StringBuilder();
stringToSign.append("GET");
stringToSign.append("&");
stringToSign.append(percentEncode("/"));
stringToSign.append("&"); stringToSign.append(percentEncode(canonicalizedQueryString.toString()
.substring(1)));
return stringToSign.toString();
}
public static String percentEncode(String value) {
try {
return value == null ? null : URLEncoder
.encode(value, CHARSET_UTF8).replace("+", "%20")
.replace("*", "%2A").replace("%7E", "~");
} catch (Exception e) {
}
return "";
}
/**
* get SignatureNonce
** */
public static String getUniqueNonce() {
UUID uuid = UUID.randomUUID();
return uuid.toString();
}
/**
* get timestamp
**/
public static String getISO8601Time() {
Date nowDate = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
df.setTimeZone(new SimpleTimeZone(0, "GMT"));
return df.format(nowDate);
}
5.添加签名。
public static String composeUrl(String endpoint, Map<String, String> queries)
throws UnsupportedEncodingException {
Map<String, String> mapQueries = queries;
StringBuilder urlBuilder = new StringBuilder("");
urlBuilder.append("http");
urlBuilder.append("://").append(endpoint);
if (-1 == urlBuilder.indexOf("?")) {
urlBuilder.append("/?");
}
urlBuilder.append(concatQueryString(mapQueries));
return urlBuilder.toString();
}
public static String concatQueryString(Map<String, String> parameters)
throws UnsupportedEncodingException {
if (null == parameters) {
return null;
}
StringBuilder urlBuilder = new StringBuilder("");
for (Map.Entry<String, String> entry : parameters.entrySet()) {
String key = (String) entry.getKey();
String val = (String) entry.getValue();
urlBuilder.append(encode(key));
if (val != null) {
urlBuilder.append("=").append(encode(val));
}
urlBuilder.append("&");
}
int strIndex = urlBuilder.length();
if (parameters.size() > 0) {
urlBuilder.deleteCharAt(strIndex - 1);
}
return urlBuilder.toString();
}
public static String encode(String value)
throws UnsupportedEncodingException {
return URLEncoder.encode(value, "UTF-8");
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
为了获取签名值,您需要遵循以下步骤进行Base64编码:
计算HMAC-SHA1值:
执行Base64编码:
在Java中,实现这一过程可以通过以下方式简化表示(注意:示例代码已根据要求调整,但请确保在实际应用中使用安全且推荐的库来处理Base64编码,例如Apache Commons Codec或Java 8及以上版本的java.util.Base64):
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Map;
import java.util.TreeMap;
public class SignatureGenerator {
public static String generateSignature(String accessKeySecret, String stringToSign) throws Exception {
// 使用HMAC-SHA1算法计算签名
SecretKeySpec signingKey = new SecretKeySpec((accessKeySecret + "&").getBytes("UTF-8"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
// 计算HMAC值并进行Base64编码
byte[] rawHmac = mac.doFinal(stringToSign.getBytes("UTF-8"));
String signature = Base64.getEncoder().encodeToString(rawHmac);
return signature;
}
public static void main(String[] args) {
try {
// 假设已经构建好排序并URL编码的查询参数字符串stringToSign
String stringToSign = "您的规范化请求字符串";
String accessKeySecret = "您的AccessKey Secret";
// 生成签名
String signature = generateSignature(accessKeySecret, stringToSign);
System.out.println("签名值(Signature): " + signature);
} catch (Exception e) {
e.printStackTrace();
}
}
}
请注意,上述代码片段展示了如何基于给定的stringToSign
和accessKeySecret
生成签名值。在实际应用中,您需要先按照规范正确构造stringToSign
,具体方法如知识库资料所述,包括排序、URL编码请求参数等步骤。