rustauth_plugins/api_key/
hashing.rs1use 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}