首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在dart中使用hmac和sha256签名消息

在dart中使用hmac和sha256签名消息
EN

Stack Overflow用户
提问于 2018-04-14 13:16:07
回答 3查看 6.9K关注 0票数 2

我试图使用消息上的一个基础64解码的秘密密钥生成一个sha256 HMAC。我想用飞镖的语言。在python中,我可以使用以下代码来完成它:

代码语言:javascript
复制
# 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')

下面是我用飞镖做的尝试:

代码语言:javascript
复制
// 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?

但我不知道怎么继续下去。我发现了一些旧的示例代码,如下所示

代码语言:javascript
复制
var message_byte = UTF8.encode(message);
hmac.add(message_byte);

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

代码语言:javascript
复制
var message_byte = UTF8.encode(message);    
var signature = hmac.convert(message_byte);
var signature_b64 = BASE64.encode(signature.bytes);

有人能帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-14 20:42:55

如果您有完整的“消息”可用,那么只需调用convert()即可。如果消息是大的或者是零碎的,那么就用块来处理它。

你的例子很简单,一步一步地拼出来。

代码语言:javascript
复制
  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);

请阅读有效飞镖指南。注意常数现在是如何小写的,在Dart使用camel情况下的变量,等等。

票数 10
EN

Stack Overflow用户

发布于 2020-09-16 16:28:54

在我最近的项目中,我不得不与hmac签署一个调用API的请求。以下是我所做的。希望这对你也有帮助。

代码语言:javascript
复制
import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:crypto/crypto.dart';

String getHmacAuthHeader({
  @required final String inputUrl,
  @required final dynamic inputJsonContent,
  @required final String appId,
  @required final String appSecrets,
  final String method = "POST",
}) {
  final url = _encodeUrl(inputUrl);
  final seconds =
      (DateTime.now().millisecondsSinceEpoch / 1000).round().toString();
  final nonce = "N${DateTime.now().millisecondsSinceEpoch}";

  final contentHash = _getMd5HashInBase64FromJson(inputJsonContent);

  final signature = "$appId$method$url$seconds$nonce$contentHash";

  final signatureHmacHashBase64 = _getHmacHashInBase64FromString(appSecrets, signature);

  final token = "$appId:$signatureHmacHashBase64:$nonce:$seconds";

  return "hmacauth $token";
}

String _encodeUrl(String url) {
  if (!url.startsWith("/")) {
    url = "/$url";
  }
  return Uri.encodeComponent(url).toLowerCase();
}

String _getMd5HashInBase64FromJson(dynamic json) {
  final jsonString = jsonEncode(json);
  final jsonStringBytes = Utf8Encoder().convert(jsonString);

  final hashBytes = md5.convert(jsonStringBytes).bytes;
  final hashBase64 = base64Encode(hashBytes);
  return hashBase64;
}

String _getHmacHashInBase64FromString(String key, String data){
  final keyBytes = Utf8Encoder().convert(key);
  final dataBytes = Utf8Encoder().convert(data);

  final hmacBytes = Hmac(sha256, keyBytes)
      .convert(dataBytes)
      .bytes;

  final hmacBase64 = base64Encode(hmacBytes);
  return hmacBase64;
}
票数 0
EN

Stack Overflow用户

发布于 2022-11-14 09:11:46

嘿,我回答这个问题迟到了。但我认为任何人都可以用这个答案。我使用https://pub.dev/packages/crypto

所以你可以用

代码语言:javascript
复制
import 'dart:convert';
import 'package:crypto/crypto.dart';


message = 'blabla'
secret = 'DfeRt[...]=='

void main() {
  var key = utf8.encode(secret);
  var bytes = utf8.encode(message);

  var hmacSha256 = Hmac(sha256, key); // HMAC-SHA256
  var digest = hmacSha256.convert(bytes);

  print("HMAC digest as bytes: ${digest.bytes}");
  print("HMAC digest as hex string: $digest");
}

我想这会节省密码和清理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49831860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档