Rust 与JS方法相比,不正确的Hmac SHA256 Base64编码导致生锈

Rust 与JS方法相比,不正确的Hmac SHA256 Base64编码导致生锈,rust,cryptography,sha256,hmac,Rust,Cryptography,Sha256,Hmac,我正在尝试将一个加密交换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)

我正在尝试将一个加密交换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,但我无法接近预期的签名。以下是我在这方面最好的两天尝试:

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=");
}
这将返回以下签名:
mdmyownm2mmnkmtzimznlyjy3otjizthjnjbimtu4zdg5ytjlztnhodc2zmnlowe4odflymi0odhjmdkxna==


我真的很感激能在正确的方向上找到一个点,在这几天里我一直在绕圈子,不知道我到底错在哪里。谢谢

只需移除十六进制的东西

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=");
}

rust签名被编码两次:首先是十六进制,然后是base64。所以它的长度也不一样,为什么用十六进制编码呢?编码为十六进制然后再编码为base64是没有意义的。两者都有相同的目的:从字节数组中生成可读且易于交换的字符串。两个都不用。正确的好地方谢谢!非常感谢你!很高兴我至少离得很近!:)