#captcha #challenge #altcha #org-docs

altcha-lib-rs

Community implementation of the Altcha library in Rust for your own server application to create and validate challenges and responses

3 releases

new 0.1.3 Apr 18, 2025
0.1.2 Mar 26, 2025
0.1.1 Aug 21, 2024
0.1.0 Aug 21, 2024

#490 in Cryptography

Download history 10/week @ 2025-01-29 20/week @ 2025-02-05 7/week @ 2025-02-12 2/week @ 2025-02-19 10/week @ 2025-02-26 6/week @ 2025-03-19 154/week @ 2025-03-26 12/week @ 2025-04-02 32/week @ 2025-04-09

204 downloads per month

Apache-2.0

25KB
393 lines

Community ALTCHA Rust Library   Build & test

Community implementation of the ALTCHA library in Rust for your own server application to create and validate challenges and responses.

For more information about ALTCHA https://altcha.org/docs


Features

  • Compatible with the ALTCHA client-side widget
  • Generates and validates self-hosted challenges
  • Expiring challenges option

Not part of this library:

  • Methods to call ALTCHA's spam filter API
  • machine-to-machine ALTCHA
  • Store previously verified challenges to prevent replay attacks

Setup

[dependencies]
altcha-lib-rs = { version = "0", features = ["json"] }

Example

use altcha_lib_rs::{create_challenge, verify_json_solution, 
                    Payload, Challenge, ChallengeOptions};

fn main() {
    // create a challenge
    let challenge = create_challenge(ChallengeOptions {
        hmac_key: "super-secret",
        expires: Some(Utc::now() + chrono::TimeDelta::minutes(1)),
        ..Default::default()
    }).expect("should be ok");

    // transmit the challenge to the client and let the client solve it
    let res = solve_challenge(&challenge.challenge, &challenge.salt, None, None, 0)
        .expect("need to be solved");
    // pack the solution into a json string
    let payload = Payload {
        algorithm: challenge.algorithm,
        challenge: challenge.challenge,
        number: res,
        salt: challenge.salt,
        signature: challenge.signature,
        took: None,
    };
    let string_payload = serde_json::to_string(&payload).unwrap();

    // receive the solution from the client and verify it
    verify_json_solution(&string_payload, "super-secret", true).expect("should be verified");
}

See example server

Dependencies

~2.3–3.5MB
~67K SLoC