为了防止被其他人注入不改存在的数据,或被攻击所以在OneBot中使用Hmac sha-1进行签名就是常见的时期。
以下是我的案例
use hmac::{Hmac, Mac};
use sha1::Sha1;
use std::convert::Infallible;
use warp::Filter;
#[allow(dead_code)]
type HmacSha1 = Hmac<Sha1>;
pub fn verify_signature(body: &[u8], received_signature: &str, secret_key: &[u8]) -> bool {
// 创建 HMAC-SHA1 实例
let mut mac = HmacSha1::new_from_slice(secret_key)
.expect("HMAC can take key of any size");
// 计算签名
mac.update(body);
let result = mac.finalize();
let expected_signature = hex::encode(result.into_bytes());
// 提取接收到的签名(去除 "sha1=" 前缀)
if let Some(received_sig) = received_signature.strip_prefix("sha1=") {
// 使用 constant_time_eq 防止时序攻击
constant_time_eq::constant_time_eq(
expected_signature.as_bytes(),
received_sig.as_bytes(),
)
} else {
false
}
}