Sensitive

Struct Sensitive 

Source
pub struct Sensitive<T: Default + Zeroize>(pub T);
Expand description

A wrapper type for sensitive data that obscures the value in debug output and securely zeros memory when dropped.

This type is useful for wrapping secrets, passwords, API keys, and other sensitive information that should not be accidentally exposed in logs, error messages, or debug output.

The inner value remains accessible through the public field 0, but when formatted using Debug, it displays as Sensitive(****) instead of the actual value.

§Type Parameters

  • T: The type of the sensitive value, which must implement Default

§Examples

use axum_conf::Sensitive;

let api_key = Sensitive::from("secret-key-12345");
println!("{:?}", api_key);  // Prints: Sensitive(****)

// Access the actual value when needed
let key_value: &str = &api_key.0;

§Security Features

  • Debug hiding: Debug output shows Sensitive(****) instead of the value
  • Memory zeroing: When Sensitive<String> is dropped, the memory is securely overwritten with zeros to prevent secrets from lingering in memory

§Security Limitations

This type does NOT:

  • Prevent the value from being read if you have access to the Sensitive instance
  • Encrypt or secure the value in memory while in use
  • Prevent the value from being serialized if using Serialize
  • Prevent the compiler from copying the value (use with care in generic contexts)

For true security, combine with other security measures like secure memory handling.

§Derive Macros

Uses ZeroizeOnDrop from the zeroize crate to automatically zero memory when dropped.

Tuple Fields§

§0: T

Implementations§

Source§

impl Sensitive<String>

Source

pub fn from(s: &str) -> Self

Creates a new Sensitive<String> from a string slice.

§Examples
use axum_conf::Sensitive;

let password = Sensitive::from("my-secret-password");

Trait Implementations§

Source§

impl<T: Clone + Default + Zeroize> Clone for Sensitive<T>

Source§

fn clone(&self) -> Sensitive<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Default + Zeroize> Debug for Sensitive<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: Default + Default + Zeroize> Default for Sensitive<T>

Source§

fn default() -> Sensitive<T>

Returns the “default value” for a type. Read more
Source§

impl<'de, T> Deserialize<'de> for Sensitive<T>
where T: Deserialize<'de> + Default + Zeroize,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<T: Default + Zeroize> Drop for Sensitive<T>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T: Default + Zeroize + PartialEq> PartialEq for Sensitive<T>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T> Zeroize for Sensitive<T>
where T: Zeroize + Default,

Source§

fn zeroize(&mut self)

Zero out this object from memory using Rust intrinsics which ensure the zeroization operation is not “optimized away” by the compiler.

Auto Trait Implementations§

§

impl<T> Freeze for Sensitive<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for Sensitive<T>
where T: RefUnwindSafe,

§

impl<T> Send for Sensitive<T>
where T: Send,

§

impl<T> Sync for Sensitive<T>
where T: Sync,

§

impl<T> Unpin for Sensitive<T>
where T: Unpin,

§

impl<T> UnwindSafe for Sensitive<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,