我正在尝试将加密交换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==
非常感谢您能向正确的方向发展,现在已经绕了好几天,而且不确定我到底在哪里出错。谢谢。
答案 0 :(得分:3)
只需删除十六进制的东西
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=");
}