#signatures #http #digest #signature #hash #actix

http-signature-normalization-actix-extractor

由您进行签名的HTTP签名库

3个不稳定版本

0.2.0 2022年12月8日
0.1.2 2022年11月29日
0.1.1 2022年11月29日

#2418 in 密码学

AGPL-3.0

29KB
301

Http Signature Normalization Actix-Web Extractor

用于请求签名的实验性Extractor

Http Signature Normalization是一个提供用户提供的签名和验证的HTTP签名库,具有最小依赖。API很简单;它有一系列用于创建和验证的步骤,使用类型确保合理使用。这个库与其他实现采取不同的方法,它更倾向于使用中间件。

使用方法

此crate提供了从Actix Web的ClientRequest类型扩展,并提供了用于验证HTTP签名和可选的Digest头部的中间件

首先,将此crate添加到您的依赖项中

actix-rt = "2.7.0"
actix-web = "4.0.0"
thiserror = "1"
http-signature-normalization-actix-extractor = "0.1.0"
sha2 = "0.10"

然后,在您的客户端中使用它

use actix_web::{http::StatusCode, web, App, HttpRequest, HttpResponse, HttpServer, ResponseError};
use http_signature_normalization_actix_extractor::{
    Algorithm, Config, ConfigGenerator, DeprecatedAlgorithm, Signed, VerifyKey,
};
use sha2::Sha256;

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().route("/", web::post().to(protected)))
        .bind("127.0.0.1:8010")?
        .run()
        .await
}

async fn protected(signed_request: Signed<String, Cfg, Sha256, Key>) -> &'static str {
    let (value, signature) = signed_request.into_parts();

    println!("{}", value);
    println!("{:#?}", signature);

    "hewwo, mr obama"
}

pub struct Cfg;

#[derive(Debug)]
pub struct Key;

#[derive(Debug, thiserror::Error)]
pub enum VerifyError {
    #[error("Unsupported algorithm")]
    Algorithm,

    #[error("Couldn't decode signature")]
    Decode,

    #[error("Invalid key")]
    Key,
}

impl ConfigGenerator for Cfg {
    fn config() -> Config {
        Config::new().require_header("accept")
    }
}

#[async_trait::async_trait(?Send)]
impl VerifyKey for Key {
    type Error = VerifyError;

    async fn init(
        _: &HttpRequest,
        key_id: &str,
        algorithm: Option<&Algorithm>,
    ) -> Result<Self, Self::Error> {
        match algorithm {
            Some(Algorithm::Hs2019 | Algorithm::Deprecated(DeprecatedAlgorithm::RsaSha256)) => (),
            _ => return Err(VerifyError::Algorithm),
        };

        if key_id != "my-key-id" {
            return Err(VerifyError::Key);
        }

        Ok(Key)
    }

    fn verify(&mut self, signature: &str, signing_string: &str) -> Result<bool, Self::Error> {
        use subtle::ConstantTimeEq;

        let decoded = base64::decode(&signature).map_err(|_| VerifyError::Decode)?;

        Ok(decoded.ct_eq(signing_string.as_bytes()).into())
    }
}

impl ResponseError for VerifyError {
    fn status_code(&self) -> StatusCode {
        StatusCode::BAD_REQUEST
    }

    fn error_response(&self) -> HttpResponse {
        HttpResponse::BadRequest().finish()
    }
}

贡献

请自由地为您发现的问题提交问题。请注意,任何贡献的代码都将根据AGPLv3许可。

许可证

版权所有 © 2022 Riley Trautman

HTTP Signature Normalization Actix Extractor是免费软件:您可以在自由软件基金会发布的GNU通用公共许可证条款下重新分发和/或修改它,许可证版本为3,或者(根据您的选择)任何较新版本。

HTTP Signature Normalization Actix Extractor是根据希望它将是有用的,但没有任何保证;甚至没有关于其商誉或特定目的适用性的暗示保证。有关详细信息,请参阅GNU通用公共许可证。此文件是HTTP Signature Normalization Actix Extractor的一部分。

您应该已经随HTTP Signature Normalization Actix Extractor一起收到GNU通用公共许可证的副本。如果没有,请参阅http://www.gnu.org/licenses/

依赖项

~20–34MB
~562K SLoC