1.创建一个UTF-8编码的Policy,将Policy进行Base64编码。
var policy = "{\"expiration\": \"2120-01-01T12:00:00.000Z\",\"conditions\": [[\"content-length-range\", 0, 104857600]]}";
var encodePolicy = base64Encode(utf8.encode(policy));
print("encodePolicy : $encodePolicy");
关于Policy是啥,找到阿里云的文档说明
var policyText = {
"expiration": "2020-01-01T12:00:00.000Z", // 设置Policy的失效时间,如果超过失效时间,就无法通过此Policy上传文件
"conditions": [
["content-length-range", 0, 1048576000] // 设置上传文件的大小限制,如果超过限制,文件上传到OSS会报错
]
}
2.使用HMAC-SHA1方法,传入accessKeySecret进行加密,最后使用base64编码得到signature。
var key = utf8.encode(accessKeySecret);
var bytes = utf8.encode(encodePolicy);
var hmacSha1 = new Hmac(sha1, key);
Digest sha1Result = hmacSha1.convert(bytes);
print("sha1Result:$sha1Result");
String signature = base64Encode(sha1Result.bytes);
print("signature:$signature");
dart 使用HMAC-SHA1加密需要引入crypto
dependencies:
crypto: ^3.0.0
import 'package:crypto/crypto.dart';
具体使用示例见:
pub.flutter-io.cn/packages/cr…
3.验证得到的signature是否正确
在阿里云找到java表单上传示例: help.aliyun.com/document_de…
写一个java类打印出signature
public static void main(String[] args) {
//创建一个UTF-8编码的Policy,将Policy进行Base64编码
final String policy = "{\"expiration\": \"2120-01-01T12:00:00.000Z\",\"conditions\": [[\"content-length-range\", 0, 104857600]]}";
String encodePolicy = new String(Base64.encodeBase64(policy.getBytes()));
System.out.println(encodePolicy);
// 生成签名
String signaturecom = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, encodePolicy);
System.out.println(signaturecom);
}
结果打印到dart的结果和java的结果是一致的。