开发者社区> 问答> 正文

下面是OSSjavasdk生成签名串的反编译源码

下面是OSS java sdk生成签名串的反编译源码,似乎其生成规则与API中描述不同(主要指数据项顺序),请指教


import com.aliyun.common.comm.RequestMessage;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;


public class SignUtils
{
  private static final String NEW_LINE = "\n";
  private static final List<String> SIGNED_PARAMTERS = Arrays.asList(new String[] { "acl", "uploadId", "partNumber", "uploads", "location", "cors", "logging", "website", "response-cache-control", "response-content-disposition", "response-content-encoding", "response-content-language", "response-content-type", "response-expires" });


  public static String buildCanonicalString(String method, String resourcePath, RequestMessage request, String expires)
  {
    StringBuilder builder = new StringBuilder();
    builder.append(new StringBuilder().append(method).append("\n").toString());


    Map headers = request.getHeaders();
    TreeMap headersToSign = new TreeMap();


    if (headers != null) {
      for (Map.Entry header : headers.entrySet()) {
        if (header.getKey() != null)
        {
          String lowerKey = ((String)header.getKey()).toLowerCase();


          if ((lowerKey.equals("Content-Type".toLowerCase())) || (lowerKey.equals("Content-MD5".toLowerCase())) || (lowerKey.equals("Date".toLowerCase())) || (lowerKey.startsWith("x-oss-")))
          {
            headersToSign.put(lowerKey, header.getValue());
          }
        }
      }
    }
    if (!headersToSign.containsKey("Content-Type".toLowerCase())) {
      headersToSign.put("Content-Type".toLowerCase(), "");
    }
    if (!headersToSign.containsKey("Content-MD5".toLowerCase())) {
      headersToSign.put("Content-MD5".toLowerCase(), "");
    }


    if (request.getParameters() != null) {
      for (Map.Entry p : request.getParameters().entrySet()) {
        if (((String)p.getKey()).startsWith("x-oss-")) {
          headersToSign.put(p.getKey(), p.getValue());
        }
      }


    }


    for (Map.Entry entry : headersToSign.entrySet()) {
      String key = (String)entry.getKey();
      Object value = entry.getValue();


      if (key.startsWith("x-oss-"))
        builder.append(key).append(':').append(value);
      else {
        builder.append(value);
      }


      builder.append("\n");
    }


    builder.append(buildCanonicalizedResource(resourcePath, request.getParameters()));


    return builder.toString();
  }


  private static String buildCanonicalizedResource(String resourcePath, Map<String, String> parameters) {
    assert (resourcePath.startsWith("/"));


    StringBuilder builder = new StringBuilder();
    builder.append(resourcePath);


    if (parameters != null) {
      String[] parameterNames = (String[])parameters.keySet().toArray(new String[parameters.size()]);


      Arrays.sort(parameterNames);
      char separater = '?';
      for (String paramName : parameterNames) {
        if (SIGNED_PARAMTERS.contains(paramName))
        {
          builder.append(separater);
          builder.append(paramName);
          String paramValue = (String)parameters.get(paramName);
          if (paramValue != null) {
            builder.append("=").append(paramValue);
          }


          separater = '&';
        }
      }
    }
    return builder.toString();
  }
}

展开
收起
aly228411705 2014-08-03 23:43:41 8452 0
1 条回答
写回答
取消 提交回答
  • Re下面是OSSjavasdk生成签名串的反编译源码
    似乎无法保证Date串在content-md5和content-type串下面吧?我是这样认为,请指教!

    -------------------------

    Re下面是OSSjavasdk生成签名串的反编译源码
    哦,我似乎知道了,JAVA丢了好久了,呵呵!
    2014-08-04 00:01:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载