共计 1528 个字符,预计需要花费 4 分钟才能阅读完成。
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); | |
} | |
} |
正文完