Skip to main content

rustauth_plugins/api_key/
hashing.rs

1use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
2use rand::rngs::OsRng;
3use rand::RngCore;
4use sha2::{Digest, Sha256};
5
6const BETTER_AUTH_KEY_CHARSET: &[u8; 52] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
7
8pub fn default_key_hasher(key: &str) -> String {
9    URL_SAFE_NO_PAD.encode(Sha256::digest(key.as_bytes()))
10}
11
12pub fn default_key_generator(length: usize, prefix: Option<&str>) -> String {
13    let key = generate_alpha_string(length);
14    match prefix {
15        Some(prefix) => format!("{prefix}{key}"),
16        None => key,
17    }
18}
19
20fn generate_alpha_string(length: usize) -> String {
21    let mut output = String::with_capacity(length);
22    let mut random = [0_u8; 32];
23    while output.len() < length {
24        OsRng.fill_bytes(&mut random);
25        for byte in random {
26            if byte >= 208 {
27                continue;
28            }
29            let index = usize::from(byte) % BETTER_AUTH_KEY_CHARSET.len();
30            output.push(char::from(BETTER_AUTH_KEY_CHARSET[index]));
31            if output.len() == length {
32                break;
33            }
34        }
35    }
36    output
37}