【问题标题】:Incorrect Hmac SHA256 Base64 encoded result in Rust compared to JS approach与 JS 方法相比,Rust 中不正确的 Hmac SHA256 Base64 编码结果
【发布时间】:2018-10-19 08:45:42
【问题描述】:

我正在尝试将加密交换 API 从 JavaScript 移植到 Rust。 JavaScript 版本进行身份验证和连接。有效负载和密钥使用 Hmac Sha256 签名并编码为 Base64。下面是 JavaScript 中的工作实现。

var param = "test";
var privateKey = "secret";
var signature = crypto.createHmac('sha256', new Buffer(privateKey, 'utf8'))
    .update(param)
    .digest('base64');

它返回以下签名:Aymga2LNFrM+tnkr6MYLFY2Jou46h2/Omogeu0iMCRQ=

在 Rust 中,我使用 Hmac SHA256 并将结果编码回 Base64,但我无法接近预期的签名。这是我最好的 2 天尝试:

extern crate ring;
extern crate data_encoding;
extern crate hex;

use ring::{digest, hmac};
use data_encoding::BASE64;
use hex::encode as hex_encode;

fn main() {
    let secret_key = "secret";
    let payload = "test";
    let signed_key = hmac::SigningKey::new(&digest::SHA256, secret_key.as_bytes());
    let signature = hex_encode(hmac::sign(&signed_key, payload.as_bytes()).as_ref());
    let b64_encoded_sig = BASE64.encode(signature.as_ref());
    assert_eq!(b64_encoded_sig, "Aymga2LNFrM+tnkr6MYLFY2Jou46h2/Omogeu0iMCRQ=");
}

这将返回以下签名:MDMyOWEwNmI2MmNkMTZiMzNlYjY3OTJiZThjNjBiMTU4ZDg5YTJlZTNhODc2ZmNlOWE4ODFlYmI0ODhjMDkxNA==

真的很感激能在正确的方向上找到一点,现在转了几天,不确定我到底哪里出错了。谢谢。

【问题讨论】:

  • 锈签名被编码两次:第一次是十六进制,然后是base64。因此它的长度也不同。
  • 为什么是十六进制编码?将十六进制 then 编码为 base64 是没有意义的。两者都有相同的目的:从字节数组中生成可读且易于交换的字符串。你永远不会同时使用两者。
  • 正确的好地方谢谢!

标签: rust cryptography sha256 hmac


【解决方案1】:

只需删除十六进制的东西

extern crate ring;
extern crate data_encoding;

use ring::{digest, hmac};
use data_encoding::BASE64;

fn main() {
    let secret_key = "secret";
    let payload = "test";
    let signed_key = hmac::SigningKey::new(&digest::SHA256, secret_key.as_bytes());
    let signature = hmac::sign(&signed_key, payload.as_bytes());
    let b64_encoded_sig = BASE64.encode(signature.as_ref());
    assert_eq!(b64_encoded_sig, "Aymga2LNFrM+tnkr6MYLFY2Jou46h2/Omogeu0iMCRQ=");
}

【讨论】:

  • 非常感谢!很高兴我至少接近了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2013-07-29
  • 2019-01-08
相关资源
最近更新 更多