一、概述当通过PostObject(HTML形式上传)上传文件到bucket时,如果bucket的权限为非公开读写,则需要执行上传操作执行签名验证。为了保证加密安全,签名一般由后端进行,然后传递给前端。签名涉及两个字段,一个是policy,一个是Signature。2、policypolicy字段用于验证请求的合法性,比如请求过期时间、上传文件的大小等,也可以用来对表单的其他字段进行一定的限制。具体规则可以参考文档。策略字段可以直接通过连接字符串生成。只需注意以下几点:到期时间以ISO8601GMT时间表示。$+字段名指的是需要限制的字段。请注意,相关字符添加了转义字符。UTF-8编码后的base64编码。3.SignatureSignature为签名字段。签名规则:使用AccessSecretKey作为密钥,使用Hmac-sha1对上述策略进行加密,加密后的结果(byte[])可以直接用Base64编码。4.示例//springboot@ComponentpublicclassAliyunOssUtils{@Value("${spring.aliyun.access-key-secret}")privateStringaccessKeySecret;@Value("${spring.aliyun.oss-image-bucket}")privateStringimageBucket;//100s,100mbpublicStringgetImagePolicy()throwsUnsupportedEncodingException{//过期时间100slongexpirationEndTime=System.currentTimeMillis()+100*1000;日期到期=新日期(expirationEndTime);StringBuilder字符串sb=();sb.append("{\"expiration\":\"");//时间传递到ISO8601GTM的方法可以自己搜索sb.append(ISO8601.getISO8601(expiration));sb.append("\",");sb.append("\"conditions\":[{\"bucket\":\"");sb.append(imageBucket);//上传限制100Msb.append("\"},[\"content-长度范围\",1,104857600]]}");字符串策略=sb.toString();返回Base64.getEncoder().encodeToString(policy.getBytes("UTF-8"));}publicStringsignature(Stringpolicy)throwsUnsupportedEncodingException,NoSuchAlgorithmException,InvalidKeyException{Macmac=Mac.getInstance("HmacSHA1");SecretKeykey=newSecretKeySpec(accessKeySecret.getBytes("UTF-8"),"HmacSHA1");mac.init(密钥);mac.update(policy.getBytes("UTF-8"));byte[]res=mac.doFinal();返回Base64.getEncoder().encodeToString(res);}}
