use sha2::{Digest, Sha256};
pub fn sha256(data: &[u8]) -> String {
let mut hasher = Sha256::new();
hasher.update(data);
format!("{:x}", hasher.finalize())
}
pub fn sha256_string(s: &str) -> String {
sha256(s.as_bytes())
}
pub fn hash_password(password: &str) -> Result<String, String> {
bcrypt::hash(password, bcrypt::DEFAULT_COST).map_err(|e| e.to_string())
}
pub fn verify_password(password: &str, hash: &str) -> Result<bool, String> {
bcrypt::verify(password, hash).map_err(|e| e.to_string())
}
pub fn base64_encode(data: &[u8]) -> String {
use base64::{engine::general_purpose, Engine as _};
general_purpose::STANDARD.encode(data)
}
pub fn base64_decode(s: &str) -> Result<Vec<u8>, String> {
use base64::{engine::general_purpose, Engine as _};
general_purpose::STANDARD
.decode(s)
.map_err(|e| e.to_string())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sha256() {
let hash = sha256_string("hello");
assert_eq!(hash.len(), 64); assert_eq!(
hash,
"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
);
}
#[test]
fn test_password_hashing() {
let password = "secret123";
let hash = hash_password(password).unwrap();
assert!(verify_password(password, &hash).unwrap());
assert!(!verify_password("wrong", &hash).unwrap());
}
#[test]
fn test_base64() {
let data = b"hello world";
let encoded = base64_encode(data);
let decoded = base64_decode(&encoded).unwrap();
assert_eq!(decoded, data);
}
}