曦涵猫猫
曦涵猫猫
发布于 2025-07-30 / 16 阅读
0
0

rust OneBot V11验证签名

为了防止被其他人注入不改存在的数据,或被攻击所以在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
    }
}


评论