在 dart 中使用 hmac 和 sha256 签署消息

thy*_*yme 1 base64 sha256 hmac dart

我尝试在消息上使用 base64 解码的密钥生成 sha256 HMAC。我想使用飞镖语言。在 python 中,我可以使用以下代码来完成:

# PYTHON CODE
import hmac, hashlib, base64
...
message = 'blabla'
secret = 'DfeRt[...]=='
secret_b64 = base64.b64decode(secret)
signature = hmac.new(secret_b64, message, hashlib.sha256)
signature_b64 = signature.digest().encode('base64').rstrip('\n')
Run Code Online (Sandbox Code Playgroud)

这是我用飞镖尝试过的:

// DART CODE
import 'package:crypto/crypto.dart';
import 'dart:convert';
...
String message = 'blabla';
String secret = 'DfeRt[...]=='
var secret_b64 = BASE64.decode(secret);
var hmac = new Hmac(sha256, secret_b64);
// what now?
Run Code Online (Sandbox Code Playgroud)

但后来我不知道如何继续。我发现了一些旧的示例代码,如下所示

var message_byte = UTF8.encode(message);
hmac.add(message_byte);
Run Code Online (Sandbox Code Playgroud)

但是,Hmac 类中不再存在“add”方法。我也试过这个,但我不确定这是否正确

var message_byte = UTF8.encode(message);    
var signature = hmac.convert(message_byte);
var signature_b64 = BASE64.encode(signature.bytes);
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

Ric*_*eap 6

如果您有完整的“消息”可用,则只需调用 convert()。如果消息很大或分块,则分块处理。

你的例子很简单,分步说明。

  String base64Key = 'DfeRt...';
  String message = 'blabla';

  List<int> messageBytes = utf8.encode(message);
  List<int> key = base64.decode(base64Key);
  Hmac hmac = new Hmac(sha256, key);
  Digest digest = hmac.convert(messageBytes);

  String base64Mac = base64.encode(digest.bytes);
Run Code Online (Sandbox Code Playgroud)

请阅读Effective Dart指南。注意常量现在是小写的,Dart 中的变量使用驼峰大小写等