shush-rs

Crates.ioshush-rs
lib.rsshush-rs
version0.1.11
sourcesrc
created_at2024-09-08 21:57:49.258297
updated_at2024-11-18 05:53:25.818365
descriptionA Rust crate designed to manage sensitive data securely by leveraging memory protection mechanisms.
homepage
repositoryhttps://github.com/Eyob94/shush-rs
max_upload_size
id1368565
size17,745
Eyob (Eyob94)

documentation

README

shush-rs

crates.io Github

A Rust crate designed to manage sensitive data securely by leveraging memory protection mechanisms. It extends the functionality of the secrecy crate to provide enhanced security features using memory locking and protection techniques. Specifically, shush-rs ensures that secrets are kept safe from unauthorized access and are properly zeroized when no longer needed.

Brief overview

  • mlock: this is a system call that locks a specified range of memory into RAM, preventing it from being swapped out to disk.
  • mprotect: is a system call that changes the access protections (read, write, execute) for a specified range of memory.

Features

  • Memory Locking: Uses mlock to lock the secret's memory page, preventing it from being swapped to disk.
  • Memory Protection: Employs mprotect to initially set the memory page to non-readable/writable and then to readable/writable only when needed.
  • Zeroization: Guarantees that secrets are securely zeroized before they are dropped, minimizing the risk of sensitive data lingering in memory.

Key Components

  • SecretBox: A secure container for sensitive data. It locks the memory of the contained secret and ensures it is zeroized on drop.
  • CloneableSecret: A trait for secrets that can be cloned, while ensuring the original is zeroized after cloning.
  • ExposeSecret and ExposeSecretMut: Traits that provide controlled access to secrets, allowing read-only or mutable access while maintaining security.

Usage

fn protect_secret(){

  let secret = Box::new(String::from("Encrypted"));

  let mut secret_box = SecretBox::new(secret); // Secret's memory page is mlocked

  println!("Secret: {:?}", secret_box); // Prints "Secret: SecretBox<alloc::string::String>([REDACTED])"

  let exposed_secret = secret_box.expose_secret();

  println!("Exposed Secret:{:?}", exposed_secret); // Prints "ExposedSecret: SecretGuardMut { data: "Encrypted" }"
} // Memory page is munlocked when it's dropped

Commit count: 55

cargo fmt