1. 概述

当通过PostObject形式(HTML表单上传)向bucket上传文件时,如果bucket的权限为非公共读写时,则须要对上传操作进行签名验证。为了保障加密平安,签名个别都由后端进行,再传递给前端。
签名所波及的字段有两个,一个是policy,一个是Signature

2. policy

policy字段用于验证申请的合法性,如申请过期工夫、上传文件的大小等。还能够通过它对表单的其余字段进行肯定的限度。具体的规定能够自行参考文档。
policy字段间接用字符串进行拼接生成即可。
留神以下几点即可:

  • 过期工夫以ISO8601 GMT工夫示意。
  • $ + 字段名称指代须要限度的字段。
  • 留神相干字符增加本义符。
  • UTF-8编码后进行Base64编码。

3. Signature

Signature即签名字段。
签名规定:以AccessSecretKey为key,应用Hmac-sha1对下面的policy进行加密,加密后果(byte[])间接进行Base64编码即可。

4. 示例

//springboot@Componentpublic class AliyunOssUtils {    @Value("${spring.aliyun.access-key-secret}")    private String accessKeySecret;    @Value("${spring.aliyun.oss-image-bucket}")    private String imageBucket;    //100s, 100mb    public String getImagePolicy() throws UnsupportedEncodingException {        //过期工夫100s        long expirationEndTime = System.currentTimeMillis() + 100 * 1000;        Date expiration = new Date(expirationEndTime);        StringBuilder sb = new StringBuilder();        sb.append("{\"expiration\": \"");        //工夫转ISO8601GTM的办法本人搜即可        sb.append(ISO8601.getISO8601(expiration));        sb.append("\",");        sb.append("\"conditions\":[{\"bucket\":\"");        sb.append(imageBucket);        //上传限度100M        sb.append("\"},[\"content-length-range\", 1, 104857600]]}");        String policy = sb.toString();        return Base64.getEncoder().encodeToString(policy.getBytes("UTF-8"));    }    public String signature(String policy) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {        Mac mac = Mac.getInstance("HmacSHA1");        SecretKey key = new SecretKeySpec(accessKeySecret.getBytes("UTF-8"), "HmacSHA1");        mac.init(key);        mac.update(policy.getBytes("UTF-8"));        byte[] res = mac.doFinal();        return Base64.getEncoder().encodeToString(res);    }}