Dart 使用HMAC-SHA1 base64 加密方法

2,596 阅读1分钟

image.png

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会报错
    ]
}

image.png

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…

www.woolha.com/tutorials/d…

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的结果是一致的。