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
@Component
public 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);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。